JavaIO流_节点流和处理流(重点)
- 节点流是底层流,直接跟数据源相连
- 处理流(包装流)包装节点流,既可以消除不同节点流的是实现差异,亦可以提供方便的方法来完成输入输出(源码理解)
- 处理流对节点流进行包装,使用修饰器设计模式,不会直接与数据源相连
- 处理流的功能更主要体现在以下两个方面:
- **1.性能的提高:**主要以增加缓存的方式来提高输入的效率
- **2.操作的便捷:**处理流可能提供了一系列便捷的方法来一次输入输出大批数据,使用更加灵活方便
- 结论,真正工作的是节点流,处理流是利用多态和动态绑定来实现便捷功能的,因此只需要外层流,即关闭处理流底层会自动关闭节点流
- BufferedReader尽量处理文本文件,二进制文件可能会丢失!
BufferedReader
如何理解处理流呢?
这里我们自己创建节点流和处理流的类来模拟处理流的作用
处理流传入一个节点流,对节点流操作基础上进行扩列
package com.wjs.BufferedRW;
/**
* 搞清为什么要使用处理流
* 模拟处理流
*/
//下划线来区分已存在的方法
//抽象类
abstract class Reader_{
//子类可以使用这个公有方法,当子类的实例调用此方法时,如果在子类中没有覆盖,那么java的动态绑定机制会自动寻找到父类的此方法。
//还有就是抽象类别跟接口混了,实现接口的类必须实现接口定义的所有方法。
public void fileReader(){}
public void stringReader(){}
/**
* 可以使用一个read抽象方法来统一管理
*/
// abstract void read();
}
//节点流01
class fileRead_ extends Reader_{
@Override
public void fileReader(){
System.out.println("文件已读入......");
}
}
//节点流02
class stringRead_ extends Reader_{
@Override
public void stringReader(){
System.out.println("字符串已读入......");
}
}
//处理流
public class BufferedReader01 extends Reader_{
private Reader_ reader_;
//构造函数
public BufferedReader01(Reader_ reader_) {
this.reader_ = reader_;
}
//扩展
//读写多次,或者加入缓存
public void writefiles(int n){
for(int i=1;i<=n;i++) reader_.fileReader();
}
public static void main(String[] args) {
new BufferedReader01(new fileRead_()).writefiles(10);
}
}
当然java中以及存在BufferedReader类和其中的功能,来模拟读入操作
- 需要注意按行读取返回null表示读取结束
- 关闭流,只需要关闭bufread,底层会自动关闭节点流
public static void read01() throws IOException {
String filePath = "C:\\Users\\Laity\\Desktop\\Java全栈\\JavaIO\\Test文件\\hello.txt";
//直接抛出异常
BufferedReader bufread = new BufferedReader(new FileReader(filePath));
String line;//按行读取
while((line=bufread.readLine())!=null){
System.out.println(line);
}
//关闭流,只需要关闭bufread,底层会自动关闭节点流
bufread.close();
}
BufferedWriter
- buf.newLine(); //换行符
public static void write01() throws IOException {
String filePath = "C:\\Users\\Laity\\Desktop\\Java全栈\\JavaIO\\Test文件\\bufwriter.txt";
BufferedWriter buf = new BufferedWriter(new FileWriter(filePath,true));
buf.write("处理流真简单!");
buf.newLine();//换行符
System.out.println("\nsuccess write...");
buf.close();
}
CopyFile练习
- 是按字符操作,不要操作二进制文件,会造成复制后的文件损坏(声音,视频,word,pdf等)
public static void copy() throws IOException {
String filePath_in = "C:\\Users\\Laity\\Desktop\\Java全栈\\JavaIO\\Test文件\\hello.txt";
String filePath_out = "C:\\Users\\Laity\\Desktop\\Java全栈\\JavaIO\\Test文件\\bufHelloCopy.txt";
BufferedReader bufread = null;
BufferedWriter bufwrite = null;
try {
bufread = new BufferedReader(new FileReader(filePath_in));
bufwrite = new BufferedWriter(new FileWriter(filePath_out,true));
String line;
while((line=bufread.readLine())!=null){
bufwrite.write(line);
bufwrite.newLine();
}
System.out.println("copy success...");
} catch (IOException e) {
e.printStackTrace();
}
if(bufwrite!=null) bufwrite.close();
if(bufread!=null) bufread.close();
}
BufferedInputStream
BufferedOutputStream
BufferedInputStream 和 BufferedOutputStream 使用类似,直接拿复制图片的模板来了
public static void copy() throws IOException {
String filePath_in = "C:\\Users\\Laity\\Desktop\\Java全栈\\JavaIO\\Test文件\\01.png";
String filePath_out = "C:\\Users\\Laity\\Desktop\\Java全栈\\JavaIO\\Test文件\\bufcopy.png";
BufferedInputStream bufin = null;
BufferedOutputStream bufout = null;
try {
bufin = new BufferedInputStream(new FileInputStream(filePath_in));
bufout = new BufferedOutputStream(new FileOutputStream(filePath_out));
byte[] buf = new byte[1024];
int readLen = 0;
while((readLen=bufin.read(buf))!=-1){
bufout.write(buf,0,readLen);
}
System.out.println("copy success...");
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
if(bufin!=null) bufin.close();
if(bufout!=null) bufout.close();
}
}