ITPub博客

首页 > 应用开发 > Java > 我去,Java IO 也太上头了,,,

我去,Java IO 也太上头了,,,

Java 作者:喝水会长肉 时间:2021-12-21 13:04:20 0 删除 编辑

1)文件

文件流也就是直接操作文件的流,可以细分为字节流(FileInputStream 和 FileOuputStream)和字符流(FileReader 和 FileWriter)。

FileInputStream 的例子:

int b
;

FileInputStream fis1 = new FileInputStream ( "fis.txt" ) ;
// 循环读取
while ( (b = fis1 . read ( ) ) != - 1 ) {
   System .out . println ( (char )b ) ;
}
// 关闭资源
fis1 . close ( ) ;

FileOutputStream 的例子:

FileOutputStream fos 
= 
new 
FileOutputStream
(
"fos.txt"
)
;

fos . write ( "Hello World" . getBytes ( ) ) ;
fos . close ( ) ;

FileReader 的例子:

int b 
= 
0
;

FileReader fileReader = new FileReader ( "read.txt" ) ;
// 循环读取
while ( (b = fileReader . read ( ) ) != - 1 ) {
    // 自动提升类型提升为 int 类型,所以用 char 强转
   System .out . println ( (char )b ) ;
}
// 关闭流
fileReader . close ( ) ;

FileWriter 的例子:

FileWriter fileWriter 
= 
new 
FileWriter
(
"fw.txt"
)
;

char [ ] chars = "Hello World" . toCharArray ( ) ;
fileWriter . write (chars , 0 , chars .length ) ;
fileWriter . close ( ) ;

当掌握了文件的输入输出,其他的自然也就掌握了,都大差不差。

2)数组

通常来说,针对文件的读写操作,使用文件流配合缓冲流就够用了,但为了提升效率,频繁地读写文件并不是太好,那么就出现了数组流,有时候也称为内存流。

ByteArrayInputStream 的例子:

InputStream is 
=
new 
BufferedInputStream
(

        new ByteArrayInputStream (
                "Hello World" . getBytes (StandardCharsets . UTF_8 ) ) ) ;
//操作
byte [ ] flush = new byte [ 1024 ] ;
int len = 0 ;
while ( - 1 != (len =is . read (flush ) ) ) {
   System .out . println ( new String (flush , 0 ,len ) ) ;
}
//释放资源
is . close ( ) ;

ByteArrayOutputStream 的例子:

ByteArrayOutputStream bos 
=
new 
ByteArrayOutputStream
(
)
;

byte [ ] info = "Hello World" . getBytes ( ) ;
bos . write (info , 0 , info .length ) ;
//获取数据
byte [ ] dest =bos . toByteArray ( ) ;
//释放资源
bos . close ( ) ;

3)管道

Java 中的管道和 Unix/Linux 中的管道不同,在 Unix/Linux 中,不同的进程之间可以通过管道来通信,但 Java 中,通信的双方必须在同一个进程中,也就是在同一个 JVM 中,管道为线程之间的通信提供了通信能力。

一个线程通过 PipedOutputStream 写入的数据可以被另外一个线程通过相关联的 PipedInputStream 读取出来。

final PipedOutputStream pipedOutputStream 
= 
new 
PipedOutputStream
(
)
;

final PipedInputStream pipedInputStream = new PipedInputStream (pipedOutputStream ) ;

Thread thread1 = new Thread ( new Runnable ( ) {
   @Override
    public void run ( ) {
        try {
           pipedOutputStream . write ( "Hello World" . getBytes (StandardCharsets . UTF_8 ) ) ;
           pipedOutputStream . close ( ) ;
        } catch (IOException e ) {
           e . printStackTrace ( ) ;
        }
    }
} ) ;
//vx耗:mbz_java_panlong 十年开发经验程序员,免费解答,备注“MI”即可
Thread thread2 = new Thread ( new Runnable ( ) {
   @Override
    public void run ( ) {
        try {
           byte [ ] flush = new byte [ 1024 ] ;
           int len = 0 ;
            while ( - 1 != (len =pipedInputStream . read (flush ) ) ) {
               System .out . println ( new String (flush , 0 ,len ) ) ;
            }

           pipedInputStream . close ( ) ;
        } catch (IOException e ) {
           e . printStackTrace ( ) ;
        }

    }
} ) ;
thread1 . start ( ) ;
thread2 . start ( ) ;

4)基本数据类型

基本数据类型输入输出流是一个字节流,该流不仅可以读写字节和字符,还可以读写基本数据类型。

DataInputStream 提供了一系列可以读基本数据类型的方法:

DataInputStream dis 
= 
new 
DataInputStream
(
new 
FileInputStream
(“das
.txt”
)
) 
;

byte b = dis . readByte ( ) ;
short s = dis . readShort ( ) ;
int i = dis . readInt ( ) ;
long l = dis . readLong ( ) ;
float f = dis . readFloat ( ) ;
double d = dis . readDouble ( ) ;
boolean bb = dis . readBoolean ( ) ;
char ch = dis . readChar ( ) ;

DataOutputStream 提供了一系列可以写基本数据类型的方法:

DataOutputStream das 
= 
new 
DataOutputStream
(
new 
FileOutputStream
(“das
.txt”
)
)
;

das . writeByte ( 10 ) ;
das . writeShort ( 100 ) ;
das . writeInt ( 1000 ) ;
das . writeLong ( 10000L ) ;
das . writeFloat ( 12.34F ) ;
das . writeDouble ( 12.56 ) ;
das . writeBoolean ( true ) ;
das . writeChar ( 'A' ) ;

5)缓冲

CPU 很快,它比内存快 100 倍,比磁盘快百万倍。那也就意味着,程序和内存交互会很快,和硬盘交互相对就很慢,这样就会导致性能问题。

为了减少程序和硬盘的交互,提升程序的效率,就引入了缓冲流,也就是类名前缀带有 Buffer 的那些,比如说 BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter。

缓冲流在内存中设置了一个缓冲区,只有缓冲区存储了足够多的带操作的数据后,才会和内存或者硬盘进行交互。简单来说,就是一次多读/写点,少读/写几次,这样程序的性能就会提高。

6)打印

恐怕 Java 程序员一生当中最常用的就是打印流了: System.out 其实返回的就是一个 PrintStream 对象,可以用来打印各式各样的对象。

System.out.println("Hello World!");

PrintStream 最终输出的是字节数据,而 PrintWriter 则是扩展了 Writer 接口,所以它的  print()/println() 方法最终输出的是字符数据。使用上几乎和 PrintStream 一模一样。

StringWriter buffer 
= 
new 
StringWriter
(
)
;

try (PrintWriter pw = new PrintWriter (buffer ) ) {
   pw . println ( "Hello World" ) ;
}
System .out . println (buffer . toString ( ) ) ;

7)对象序列化/反序列化

序列化本质上是将一个 Java 对象转成字节数组,然后可以将其保存到文件中,或者通过网络传输到远程。

ByteArrayOutputStream buffer 
= 
new 
ByteArrayOutputStream
(
)
;

try (ObjectOutputStream output = new ObjectOutputStream (buffer ) ) {
   output . writeUTF ( "Hello World" ) ;
}
System .out . println (Arrays . toString (buffer . toByteArray ( ) ) ) ;

与其对应的,有序列化,就有反序列化,也就是再将字节数组转成 Java 对象的过程。


try 
(ObjectInputStream input 
= 
new 
ObjectInputStream
(
new 
FileInputStream
(

        new File ( "Person.txt" ) ) ) ) {
   String s = input . readUTF ( ) ;
}

8)转换

InputStreamReader 是从字节流到字符流的桥连接,它使用指定的字符集读取字节并将它们解码为字符。

InputStreamReader isr 
= 
new 
InputStreamReader
(

        new FileInputStream ( "demo.txt" ) ) ;
char [ ]cha = new char [ 1024 ] ;
int len = isr . read (cha ) ;
System .out . println ( new String (cha , 0 ,len ) ) ;
isr . close ( ) ;

OutputStreamWriter 将一个字符流的输出对象变为字节流的输出对象,是字符流通向字节流的桥梁。

File f 
= 
new 
File
(
"test.txt"
) 
;

Writer out = new OutputStreamWriter ( new FileOutputStream (f ) ) ; // 字节流变为字符流  
out . write ( "hello world!!" ) ;     // 使用字符流输出  
out . close ( ) ;

经过我的梳理,是不是感觉 IO 也没多少东西!针对不同的场景、不同的业务,选择对应的 IO 流就可以了,用法上就是读和写。




来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70010294/viewspace-2848650/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2021-11-19

  • 博文量
    199
  • 访问量
    86383