节点流和处理流
节点流:可以从一个特定的数据源(文件,数组,管道等)读写数据,如FileReader,FileWriter。(直接操作数据源,所以比较底层的,功能不是很强大)
处理流(也叫包装流):“链接”在已存在的流(节点流或处理流)之上,为程序提供了更为强大的读写功能,如BufferedReader,BufferedWriter。(对节点流进行包装,功能更加强大,而且更加加灵活)-->这种模式叫做修饰器模式
例:BufferedReader类中,有属性 Reader in;,即可以封装一个节点流,该节点流是任意的,只要是Reader子类。
处理流的功能:1.性能的提高:主要以增加缓冲的方式来提高输入输出的效率。 2.操作的便携:处理流可能提供了一系列便捷的方法来一次输入输出大量的数据,使用更加灵活方便。
当我们关闭包装流时,他的底层会自动关闭我们这个包装流中的节点流。
什么是二进制文件:图片,音频,视频等都是二进制文件,用字符流进行操作会造成文件的损害。
BufferedReader
readLine()方法按行读取,效率高
public static void main(String[] args){
String filepath="D:\\file-study\\story.txt";
BufferedReader bufferedRead=null;
try {
//创建bufferedReader
bufferedRead = new BufferedReader(new FileReader(filepath));
//读取
//readLine()按行读取,效率高
//当返回为null时,表示文件读取完毕
String str;
while((str = bufferedRead.readLine())!=null){
System.out.println(str);
}
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
try {
//关闭流,只需要关闭BufferedReader,因为底层会自动自动关闭节点流
bufferedRead.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
BufferedWriter
public static void main(String[] args) {
String filepath="D:\\file-study\\buffered.txt";
BufferedWriter bufferedWriter=null;
try {
bufferedWriter=new BufferedWriter(new FileWriter(filepath,true));
bufferedWriter.write("Hello,沈宇诚");
//插入一个换行
bufferedWriter.newLine();
bufferedWriter.write("Hello,沈宇诚1");
bufferedWriter.newLine();
bufferedWriter.write("Hello,沈宇诚2");
bufferedWriter.newLine();
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
try {
bufferedWriter.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
使用BufferedReader和BufferedWriter实现Copy
public static void main(String[] args) {
String readpath="D:\\file-study\\buffered.txt";
String writepath="D:\\file-study\\buffered-copy.txt";
BufferedReader bufferedReader=null;
BufferedWriter bufferedWriter=null;
String line;
try {
bufferedReader=new BufferedReader(new FileReader(readpath));
bufferedWriter=new BufferedWriter(new FileWriter(writepath));
while((line=bufferedReader.readLine())!=null){
//每读入一行,写入一行
bufferedWriter.write(line);
//插入换行
bufferedWriter.newLine();
}
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
try {
bufferedReader.close();
bufferedWriter.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
用BufferedInputStream和BufferedOutputStream拷贝图片(二进制文件)
要熟练inputStream读取的方法
public static void main(String[] args) {
String readpath="D:\\file-study\\study.jpg";
String writepath="D:\\file-study\\study-copy.jpg";
BufferedInputStream bufferedInputStream=null;
BufferedOutputStream bufferedOutputStream=null;
byte[]buff=new byte[1024];
int dataLen=0;
try {
bufferedInputStream=new BufferedInputStream(new FileInputStream(readpath));
bufferedOutputStream=new BufferedOutputStream(new FileOutputStream(writepath));
while((dataLen=bufferedInputStream.read(buff))!=-1){
bufferedOutputStream.write(buff,0,dataLen);
}
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
//关闭流
try {
bufferedInputStream.close();
bufferedOutputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}