目录
- 节点流、处理流
- 读文件:BufferedReader 的使用
- 写文件:BufferedWriter 的使用
- 节点流
- 处理流
- 节点流和处理流的区别和联系
- 字符流 BufferedReader / BufferedWriter 拷贝文本文件练习
- 字符流 BufferedReader / BufferedWriter 用来拷贝文本文件,拷贝二进制文件(图片、音乐、视频、压缩包等都是二进制文件)会出错!!!
- 字节流 BufferedOutputStream / BufferedInputStream 拷贝二进制文件
- 字节流既可以拷贝二进制文件,也可以拷贝文本文件
节点流、处理流
读文件:BufferedReader 的使用
package day06.reader;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Demo {public static void main(String[] args) throws IOException {String filePath = "E:\\news3.txt";BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));String line; while((line = bufferedReader.readLine()) != null){System.out.println(line);}bufferedReader.close();}
}
写文件:BufferedWriter 的使用
package day06.reader;import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Demo2 {public static void main(String[] args) throws IOException {String filePath = "E:\\news4.txt";BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath, true));bufferedWriter.write("Gin");bufferedWriter.newLine();bufferedWriter.write("Vodka");bufferedWriter.newLine();bufferedWriter.write("Vermouth");bufferedWriter.newLine();bufferedWriter.close();}
}
节点流
节点流可以从一个特定的数据源读写数据,如 FileReader
、FileWriter
。节点流是比较底层的流,直接操作数据源。例:
处理流
处理流(也叫包装流),是 “ 连接 ” 在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,也更加灵活,如 BufferedReader
、BufferedWriter
-
为了使处理流的功能更加强大,在处理流(包装流)的底层对 节点流 进行了封装:
-
以 BufferedReader
为例: BufferedReader
类中,有属性 Reader
,即:可以封装一个节点流,只要是 Reader
的子类即可,而 Reader
的子类有很多,这样一来就大大加强了流的功能。【这种设计模式称之为修饰器模式】
-
-
-
BufferedWriter
同理
-
-
节点流和处理流的区别和联系
- 节点流是
底层流 / 低级流
,直接跟数据源相接。 - 处理流(包装流)包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。
- 处理流(包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连 【模拟修饰器设计模式】
- 模拟修饰器设计模式
字符流 BufferedReader / BufferedWriter 拷贝文本文件练习
字符流 BufferedReader / BufferedWriter 用来拷贝文本文件,拷贝二进制文件(图片、音乐、视频、压缩包等都是二进制文件)会出错!!!
package day06.reader;import java.io.*;
public class CopyTest {public static void main(String[] args) {String srcFile = "E:\\imgs";String destFile = "E:\\imgs2";BufferedReader br = null;BufferedWriter bw = null;try {br = new BufferedReader(new FileReader(srcFile));bw = new BufferedWriter(new FileWriter(destFile));String line;while ((line = br.readLine()) != null){bw.write(line);bw.newLine();}System.out.println("拷贝完毕!");} catch (IOException e) {e.printStackTrace();} finally {try {if(br != null){br.close();}if(bw != null){bw.close();}} catch (IOException e) {e.printStackTrace();}}}
}
字节流 BufferedOutputStream / BufferedInputStream 拷贝二进制文件
字节流既可以拷贝二进制文件,也可以拷贝文本文件
package day06.reader;import java.io.*;
public class CopyTest2 {public static void main(String[] args) {String srcFile = "E:\\HBuilderX.3.1.22.20210709.zip";String destFile = "E:\\HBuilderX.3.1.22.20210709-2.zip";BufferedInputStream bis = null;BufferedOutputStream bos = null;try {bis = new BufferedInputStream(new FileInputStream(srcFile));bos = new BufferedOutputStream(new FileOutputStream(destFile));byte[] buf = new byte[1024];int readLen;while((readLen = bis.read(buf)) != -1){bos.write(buf, 0, readLen);}System.out.println("拷贝完成!");} catch (IOException e) {e.printStackTrace();} finally {try{if(bis != null){bis.close();}if(bos != null){bos.close();}}catch(IOException e){e.printStackTrace();}}}
}