概念:
节点流:从一个特定的源读写数据,比如FileReader,FileWriter,都是对文件源进行读写
包装流(处理流):包装已经存在的流(节点流/包装流),使其功能更强大,不直接连接数据源,是将已存在的流和程序连接起来
以BufferedReader为例:从其源码中可以看到BufferedReader类有Reader类型的属性,所以可以包装所有的继承自Reader的流
节点流和处理流的区别和联系
①节点流是底层流是低级流,直接连接数据源
②包装流包装节点流可以消除不同类型节点流的实现差异,也可以提供更方便的方法完成输入输出
③包装流对节点流进行包装,使用了修饰器设计模式,不会与数据源直接相连
处理流(BufferedReader 和 BufferedWriter)
属于字符流,按照字符读取数据 ,不能用来处理二进制文件,关闭时仅关闭外层流即可
package com.edu.reader_; import java.io.*; /** * @author mtl121 * @version 1.0 */ public class BufferedReader_ { public static void main(String[] args) throws IOException { String filename = "e:/reame1.txt"; BufferedReader bufferedReader = new BufferedReader(new FileReader(filename)); String line; //BufferedReader提供的方法 while((line = bufferedReader.readLine()) != null){ System.out.println(line); } //只需要关闭外层流,因为底层会自动去关闭节点流 bufferedReader.close(); } }
package com.edu.reader_; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; /** * @author mtl121 * @version 1.0 */ public class BufferedWriter_ { public static void main(String[] args) throws IOException { String content = " hell,一个我哩个i熬过i奥"; String filename = "e:/a.txt"; //当我们想要追加而不是覆盖的时候,是在节点流控制 BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filename,true/*在这里控制*/)); bufferedWriter.write(content); bufferedWriter.newLine(); bufferedWriter.write("java 攻城狮·~"); bufferedWriter.close(); } }
案例使用BufferedReader和BufferedWriter 实现文件拷贝:
package com.edu.reader_; import java.io.*; /** * @author mtl121 * @version 1.0 */ public class Buffercopy { public static void main(String[] args) { //使用BufferedReader 和BufferedWriter不要去操作二进制文件{音频,doc,pdf等}, 可能会造成文件损坏 String offfile = "e:/reame1.txt"; String endfile = "e:/a.txt"; BufferedReader br = null; BufferedWriter bw = null; try { br = new BufferedReader(new FileReader(offfile)); bw = new BufferedWriter(new FileWriter(endfile)); String line; while((line = br.readLine()) != null) { bw.write(line); //readLine仅仅是将一行数据写入,没有换行 bw.newLine(); } } catch (IOException e) { e.printStackTrace(); } finally { try { if(br != null){ br.close(); } if (bw != null) { bw.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
处理流(BufferedInputStream 和 BufferedOutputStream),同BufferedReader一样,它可以接受一切InputStream的子类,但是InputStream属性不是定义在BufferedinputStream里面,而是定义在他的父类FilterinputStream里面,同理BufferedOutputStream(看源码)
BufferedInputStream是字节流,在创建时,回创建一个内部缓冲区数组,默认缓冲区大小是8M
BufferedOutputStream是字节流,实现缓冲的输出流可以将多个字节写入底层输出流中,而不是为每个字节的写入去调用底层系统
![]()
![]()