节点流和处理流
1.基本介绍
- 节点流可以从一个特定的数据源读写数据,如FileReader,FileWriter(文件、数组、管道和字符串);
- 处理流也叫包装流,是“连接”在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,如BufferedReader,BufferedWriter(比如:BufferedReader类中,有属性Reader,即可以封装一个节点流,该节点流可以是任意的,只要是Reader子类。)。
2.结点流和处理流的区别和联系
- 节点流是底层流/低级流,直接跟数据源相连;
- 处理流包装节点流,即可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出;
- 处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连【修饰器设计模式】;
1.处理流的功能主要体现在以下两方面
- 性能的提高:主要以增加缓冲的方式来提高输入输出的效率;
- 操作的便捷:处理流可能提供一系列便捷的方法来一次输入输出的大批量的数据,使用更加灵活方便。
3.字符代码案例
1.BufferedReader和BufferedWriter
注意:BufferedReader和BufferedWriter主要处理字符文件,千万别处理二进制文件,不然会乱码
BufferedWriter bufferedWriter = null;
try {
//在节点流放true,就可以追加内容
bufferedWriter = new BufferedWriter(new FileWriter("d:\\BufferedWriter.txt",true));
bufferedWriter.write("你好吗水水水水水");
bufferedWriter.newLine();//插入一个和系统相关的换行符
bufferedWriter.write("工程师");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//关闭外层流即可,传入的节点流会在底层关闭
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void copy(){
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
String readL = null;
try {
bufferedReader = new BufferedReader(new FileReader("d:\\BufferedWriter.txt"));
bufferedWriter = new BufferedWriter(new FileWriter("d:\\BufferedWriter2.txt"));
//一行一行的读取
while ((readL=bufferedReader.readLine())!=null){
bufferedWriter.write(readL);
bufferedWriter.newLine();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedReader.close();
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.字节代码案例
1.BufferedInputStream和BufferedOutputStream
- BufferedInputStream是字节流,在创建BufferedInputStream时,会创建一个内部缓冲区数组。
- BufferedOutputStream是字节流,实现缓冲的输出流,可以将过个字节写入底层输出流中,而不必对每次字节
2.代码案例
@Test
public void copy1(){
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try {
int readLn = 0;
byte[] bytes = new byte[1024];
bufferedInputStream = new BufferedInputStream(new FileInputStream("d:\\Collection.png"));
bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("d:\\Collection222.png"));
while ((readLn=bufferedInputStream.read(bytes))!=-1){
bufferedOutputStream.write(bytes,0,readLn);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(bufferedInputStream!=null){
bufferedInputStream.close();
}
if(bufferedOutputStream!=null){
bufferedOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}