缓冲流: 是处理流的一种,主要作用是提高文件的读写效率
处理流: 套接在已有的流(不一定是节点流,处理流也可)的基础上
处理流不能直接作用在文件上
BufferedInputStream是来包装FileInputStream的,包装完以后就用这个流进行处理,以此类推
import java.io.*;
//非文本文件的复制
public class Test {
public static void main(String[] args) {
//快速写try的方法alt+shift+z
FileOutputStream fos=null;
FileInputStream fis=null;
BufferedInputStream bis=null;
BufferedOutputStream bos=null;
try{
//1.造文件
File f1 = new File("fun.jpg");
File f2 = new File("fun1.jpg");
//2.造流,要先造节点流,再造缓冲流
fis=new FileInputStream(f1);
fos=new FileOutputStream(f2);
bis=new BufferedInputStream(fis);
bos=new BufferedOutputStream(fos);
//3.复制的细节
byte[] bytes=new byte[5];
int len;
while((len=bis.read(bytes))!=-1){
bos.write(bytes,0,len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
//4.资源关闭,注意关闭顺序的要求:先关闭外层(先关闭外层的哪一个流无所谓)的流再关闭内层的流(先关闭内层的哪一个流无所谓)
//可以省略书写关闭内层流,当然写上一定不算错
try {
if(bos!=null)
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(bis!=null)
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
//fos.close();在关闭外层流的时候,会自动帮我们关掉内层流
//fis.close();在关闭外层流的时候,会自动帮我们关掉内层流
}
}
}
缓冲流能够提高读写速度的原因: 内部提供了一个缓冲区,当读入的数据装满了缓冲区时进行一次性写出,通过这种方式提高速度
BuffreredOutputStream中有一个flush()方法,用来刷新缓冲区(把数据写出去,清空缓冲区),正常情况下读入的数据超过了缓冲区的大小就会自动flush(在write的过程中会自动flush)
直接显式调用flush是读入的数据还没有装满缓冲区就去flush
BufferedReader和BufferedWriter的用法类似,不能用来处理非文本文件
熟练之后可以这么写:
import java.io.*;
//文本文件的复制
public class Test {
public static void main(String[] args) {
//快速写try的方法alt+shift+z
BufferedReader br=null;
BufferedWriter bw=null;
try {
//造文件造流
br = new BufferedReader(new FileReader(new File("hello1.txt")));
bw = new BufferedWriter(new FileWriter(new File("fun.txt")));
//读写操作
//方式一,使用char型数组
//char[] chars=new char[5];
//int len;
//while((len=br.read(chars))!=-1){
// bw.write(chars,0,len);//注意1kb=1024byte
//}
//方式二,利用BufferedReader多的一种处理方式,叫做readLine(),一次读一行,返回的是String,使用String
String data;
while((data=br.readLine())!=null){//readLine()用String返回当前这一行的数据(不包含换行符),到文件的末尾返回null
//方法一:
//bw.write(data+"\n");//data中不包含换行符,需要自己加换行符,否则得到的数据是一行的
//方法二:
bw.write(data);
bw.newLine();//用来加换行符
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭资源
try {
if(br!=null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(bw!=null)
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
注意: 字节流可以实现文本文件的复制,相应的缓冲流如果是字节流当然也能实现,只是建议文本文件以char为单位进行处理更合适一些