目录
节点流、处理流
读文件:BufferedReader 的使用
package day06.reader;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
/**
* @Author: Gin
* @Description: 演示 BufferedReader 的使用
* @Modified By: Gin
* @Date: Created in 9:07 2021/9/3
*/
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; // 按行读取,效率高
// 1. BufferedReader.readLine() 是按行读取
// 2. 当读取到 null 时,表示读取完成
while((line = bufferedReader.readLine()) != null){
System.out.println(line);
}
// 关闭流,这里只需要关闭 BufferedReader,因为底层会自动关闭节点流
/*
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
try {
in.close(); // 这里的 in,就是我们传入的 new FileReader(filePath)
} finally {
in = null;
cb = null;
}
}
}
*/
bufferedReader.close();
}
}
写文件:BufferedWriter 的使用
package day06.reader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
/**
* @Author: Gin
* @Description:
* @Modified By: Gin
* @Date: Created in 9:19 2021/9/3
*/
public class Demo2 {
public static void main(String[] args) throws IOException {
String filePath = "E:\\news4.txt";
// 1. new FileWriter(filePath, true):表示追加写
// 2. new FileWriter(filePath):表示覆盖写
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.*;
/**
* @Author: Gin
* @Description: 利用处理流实现文件拷贝
* @Modified By: Gin
* @Date: Created in 9:31 2021/9/3
*/
public class CopyTest {
public static void main(String[] args) {
// 1. BufferedReader 和 BufferedWriter 是按照字符操作的
// 2. 不要去操作二进制文件,可能造成文件损坏
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.*;
/**
* @Author: Gin
* @Description: BufferedOutputStream / BufferedInputStream 拷贝二进制文件
* @Modified By: Gin
* @Date: Created in 9:50 2021/9/3
*/
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();
}
}
}
}