[2025.1.17 JavaSE学习]字节I/O流 && 字符I/O流 && 节点流
I/O Stream中常用的类
字节输入输出流
- 该抽象类是所有类字节输入流的超类
- 常用子类如下:
- FileInputStream:文件输入流
String filePath = "test.txt"; int readData = 0; int readLen = 0;//读取字节数组长度 byte[] buffer = new byte[8];//一次读取8个字节 FileInputStream fileInputStream = null; try{ fileInputStream = new FileInputStream(filePath); //while((readData = fileInputStream.read()) != -1){ //System.out.print((char)readData); //上述会产生乱码,因为一个字符由几个字节组成,只读一个字节进行转换无法得到字符数据(最好用字符流) //} while((readLen = fileInputStream.read(buffer)) != -1){ System.out.print(new String(buffer, 0, readLen)); } }catch(IOException e){ e.printStackTrace(); }finally{ fileInputStream.close(); }
- BufferedInputStream:缓冲字节输入流
- ObjectInputStream:对象字节输入流
- 对应的输出流:
- FileOutputStream:文件输出流
- BufferedOutputStream:缓冲字节输出流
- ObjectOutputStream:对象字节输出流
字符输入输出流
-
FileReader相关方法:
- new FileReader(File/String)
- read:每次读取单个字符并返回该字符,末尾返回-1
- read(char []):批量读取多个字符返回读取字符数,末尾返回-1
-
FileWriter相关方法:
- new FileWriter(File/String):覆盖模式,流的指针在首端
- new FileWriter(File/String, true):追加模式,流的指针在尾端
- write(int):写入单个字符
- write(char[]):写入指定数组
- write(char[],off,len):写入指定数组的指定部分
- write(string):写入整个字符串
- write(string,off,len):写入字符串指定部分
- PS: FileWriter使用后必须关闭close或刷新flush,否则无法写入
节点流 && 处理流
节点流可以从一个特定的数据源读写数据,如FileWriter、FileReader
处理流(包装流)是“连接”已经存在的流(节点流or处理流)之上,为程序提供更为强大的读写功能,如BufferedReader、BufferedWriter
- 如上,BufferedReader内部包装了一个Reader,可以是任何数据流,只需要是Reader的子类,包装输入流也同理(父类引用指向子类对象)
- 这种设计模式称为修饰器模式:
- 动态扩展功能:在不修改原始类的情况下,通过修饰器类动态地添加功能
- 包装对象:修饰器类持有原始类的引用,并在调用原始类方法前后添加额外的行为
- 关闭处理流时,只需关闭外层流即可,例如BufferedReader,外层close底层会自动关闭底层流
两者区别和联系
- 节点流是底层流/低级流,直接和数据源相接
- 处理流包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出
- 处理流对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连
处理流主要功能体现在以下两个方面
- 性能的提高:主要以增加缓冲的形式来提高输入输出效率
- 操作的便捷:处理流提供了一系列便捷的方法来一次输入输出大批量数据,使用更为灵活方便