二进制I/O流有哪几种及其区别

要点:

1.二进制I/O不涉及编码和解码,因此比文本I/O更加高效

2.抽象类InputStream是读取二进制数据的根类,抽象类OutputStream是写入二进制数据的根类

3.二进制I/O类中所有方法都声明为抛出java.io.IOException或java.io.IOException的子类

4.用于二进制I/O的类,如下图:

各类要点:

一、FileInputStream和FileOutputStream 用于从/向文件读取/写入字节

1.构造方法 FileOutputStream(file: File, append: boolean) 为了既保留原有文件现有的内容又可以给文件追加新数据,需要将参数append设置为true。

2.使用try-with-resources来声明和创建输入输出流,在使用后可以自动关闭(不关闭流可能会在输出文件中造成数据受损,或导致其他的程序设计错误)

try(FileInputStream input = new FileInputStream("temp.dat")) {
    
         //其他代码

}

二、FilterInputStream和FilterOutputStream 过滤器数据流是为某种目的过滤字节的数据流

1.DataInputStream (从数据流读取字节,并且将它们转化为合适的基本类型或字符串)和 DataOutputStream(将基本类型的值或字符串转化为字节,并且将字节输出到数据流)

1.1构造方法:DataInputStream(in: InputStream)

1.2应该按存储的顺序和格式读取文件中的数据

1.3EOFException异常可以用来检查是否已经到达文件尾

try {
    //其他代码
}
//当文件已经到达尾部时,若再进行读则会抛出EOFException异常
//通过捕获这个异常可以作为文件到达尾部的一个标志
catch (EOFException ex) {
    // TODO: handle exception
    System.out.println("All data were read");
}

2.BufferedInputStream和BufferedOutputStream 可以通过减少磁盘读写次数来提高输入和输出的速度

2.1使用BufferedInputStream时,磁盘上的整块数据一次性地读入到内存的缓冲区中,然后从缓冲区将个别的数据传递到程序中

2.2使用BufferedOutputStream时,个别的数据首先写入到内存的缓冲区中,当缓冲区已满时,缓冲区中的所有数据一次性写入磁盘中

2.3应该总是使用缓冲区I/O来加速输入和输出。对于小文件,我们可能注意不到性能的提升。但是,对于超过100MB的大文件,我们将会看到使用缓冲的I/O带来的实质性的性能提升。

//构造方法,bufferSize指定缓冲区大小,默认为512个字节
BufferedOutputStream(in: InputStream, bufferSize: int)
BufferedInputStream(in: InputStream, bufferSize: int)

//没有使用缓冲区I/O
DataOutputStream os = new DataOutputStream(
    	new FileOutputStream("temp.dat"));

//使用了缓冲区I/O
DataOutputStream os = new DataOutputStream(
    	new BufferedOutputStream(new FileOutputStream("temp.dat")));

三、对象I/O

ObjectInputStream和ObjectOutputStream类可以用于读/写可序列化对象(实现了serializable接口)

猜你喜欢

转载自blog.csdn.net/wqsbenren/article/details/88814810