要点:
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接口)