BuffereInputStream(带有缓冲区的字节输入流)继承于FilterInputStream,而FilterInputStream继承于InputStream,BuffereOutputStream(带有缓冲区的字节输出流)继承于FilterOutputStream,而FilterOutputStream继承于OutputStream,关于FilterInputStream和FilterOutputStream,其实它们只是个“装饰器模式”的封装,也就是说它并没有给出具体的功能实现,它具体的功能实现都是通过它的子类来实现的。
这两个其实主要就是一个缓冲的作用,我们知道,如果直接让文件或程序跟内存进行交互,效率是十分低下的,而通过缓冲流进行交互,能够大大提高效率,缓冲流的主要作用就是提高了效率。
对于文件的存在与否的反应,和其它一样,不存在时,输入流会报错,输出流会自动创建。
常用的方法是:read(),read(byte [] b,int off,int len),write(int b),write(byte[] b,int off,int len),close();这些具体参照InputStream和OutputStream中这些方法的使用。
下面我们通过代码实例来对其进行学习:
①利用缓冲流进行拷贝,一个一个字节拷贝
@Test
public void t2() throws Exception{
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("H:\\javaio\\测试.avi"),2*1024);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("H:javaio\\测试copy2.avi"),2*1024);
int len;
while((len = bis.read()) != -1){
bos.write(len);
}
bos.close();
bis.close();
}
②利用缓冲流进行拷贝,多个字节多个字节拷贝
@Test
public void t1() throws Exception{
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("H:\\javaio\\测试.avi"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("H:javaio\\测试copy1.avi"));
byte[] b = new byte[2*1024];
int len;
while((len = bis.read(b)) != -1){
bos.write(b, 0, len);
}
bos.close();
bis.close();
}
③利用缓冲流实现对文件的追加
@Test
public void t3() throws Exception{
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("H:\\javaio\\test.txt",true));
bos.write("sadadas".getBytes());
bos.close();
}
④利用缓冲流读取文件
@Test
public void t5() throws Exception{
FileInputStream fis = new FileInputStream("H:\\javaio\\qianfengwrite1.txt");
int len;
while((len = fis.read()) != -1){
System.out.print((char)len);
}
fis.close();
}