文章目录
- 节点流和处理流
- BufferedReader
- BufferedWriter
- Bufferd拷贝
- BufferedInputStream/BufferedOutputStream
节点流和处理流
-
数据源就是存放数据的地方,可以是 文件、数组 等等;
- 节点流是比较底层的,直接操作二进制数据
-
包装流(处理流)是将节点流给包装了起来,更加灵活(相当于任意节点流,任意数据源都可)
BufferedReader里的Reader方法相当于把FileInputStream、FileReader等等给包装了起来,涵盖这些方法,可以是任意一个节点流(只要是Reader的子类就可以)同理 BufferedWriter也一样 (装饰器模式)
节点流和处理流一览:
Reader是抽象父类,而FileInputStream、FileReader等等是实现方法的子类(节点流);BufferedReader是继承Reader的属性,然后把节点流给封装扩展起来,使用更便捷,不用区分文件、数组、字符等等。
- BufferedReader和BufferedWriter属于字符流,都是按字符来读取数据的;
- 真正工作的其实还是节点流而不是处理流,处理流只是做了一个封装;
- 关闭处理流时,只需关闭最外层流(处理流)即可;
BufferedReader
- 使用BufferReader读取文本文件,并显示在控制台;
使用 readLine() 按行读取:
public static void main(String[] args) throws Exception {
String filePath = "d:\\HelloWorld.txt" ;//自行创建编辑
//创建BufferedReader对象
BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
//读取
String line;//按行读取,效率高
/*
说明:
1.bufferedReader.readLine() 按行读取
2.返回null时,表示文件读取完毕
*/
while((line = bufferedReader.readLine()) != null){
System.out.println(line);
}
//关闭流,只需关闭BufferedReader,因为底层的节点流会自动关闭
bufferedReader.close();
}
BufferedWriter
public static void main(String[] args) throws IOException {
String filePath = "d:\\note.txt";//创建空白文件
//创建BufferedWriter对象
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath));//覆盖写入
bufferedWriter.write("Hello!"); //需要追加就FileWriter(filePath,true)
//插入一个和系统相关的换行
bufferedWriter.newLine();
bufferedWriter.write("Java!");
bufferedWriter.newLine();
bufferedWriter.write("祝你开心每一天~");
//关闭外层流即可
bufferedWriter.close();
}
Bufferd拷贝
public static void main(String[] args) throws Exception {
/*
说明:
1.BufferedReader和BufferedWriter是安装字符操作
2.不要去操作二进制文件,可能会造成损坏(例如音视频、doc、pdf)
*/
String srcFilePath = "d:\\HelloWorld.txt";//提前创建
String destFilePath = "d:\\hello.txt";//目标文件
BufferedReader bufferedReader =null;
BufferedWriter bufferedWriter =null;
bufferedReader = new BufferedReader(new FileReader(srcFilePath));
bufferedWriter = new BufferedWriter(new FileWriter(destFilePath));
String line;
while((line=bufferedReader.readLine())!=null) {
bufferedWriter.write(line);
bufferedWriter.newLine();
}
System.out.println("拷贝完毕");
//关闭资源
if(bufferedReader!=null) bufferedWriter.close();
if(bufferedWriter!=null) bufferedWriter.close();
}
既然 BufferedReader/BufferedWriter 不能操作二进制文件,
那对于二进制文件,该采用什么方法呢?
BufferedInputStream/BufferedOutputStream
- BufferedInputStream 是字节流 ,实现缓冲的输出流,可以将多个字节写入底层输出流中,而不必对每次字节写入调用底层系统。
音乐、视频的拷贝:
/*
演示使用BufferedInputStream和BufferedOutputStream拷贝
*/
public static void main(String[] args) throws Exception{
String srcFilePath = "d:\\蜘蛛侠.jpg";
String destFilePath = "d:\\spiderman.jpg";
//创建BufferedInputStream和BufferedOutputStream对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFilePath));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
//循环读取文件,并写入到destFilePath中
byte[] buff = new byte[1024];
int readLen = 0;
//当返回-1时,表示文件读取完毕
while((readLen = bis.read(buff))!=-1){
bos.write(buff,0,readLen);
}
//关闭外层的处理流即可
bis.close();
bos.close();
字节流不仅仅可以操作二进制文件,还可以操作文本文件