1.缓冲流:
- BufferedInputStream
- BufferedOutputStream
- BufferedReader
- BufferedWriter
2.作用:提供流的读取、写入的速度
- 提高读写速度的原因:内部提供了一个缓冲区
3 处理流,就是“套接”在已有的流的基础上。
为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区。
缓冲流要“套接”在相应的节点流之上,根据数据操作单位可以把缓冲流分为:
-
BufferedInputStream 和 BufferedOutputStream
-
BufferedReader 和 BufferedWriter
-
当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区
-
当使用BufferedInputStream读取字节文件时,BufferedInputStream会一次性从文件中读取8192个(8Kb),存在缓冲区中,直到缓冲区装满了,才重新从文件中读取下一个8192个字节数组。
-
向流中写入字节时,不会直接写到文件,先写到缓冲区中直到缓冲区写满,BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。使用方法flush()可以强制将缓冲区的内容全部写入输出流
-
关闭流的顺序和打开流的顺序相反。只要关闭最外层流即可,关闭最外层流也会相应关闭内层节点流
-
flush()方法的使用:手动将buffer中内容写入文件
-
如果是带缓冲区的流对象的close()方法,不但会关闭流,还会在关闭流之前刷新缓冲区,关闭后不能再写出
上代码
public class BufferedTest {
//实现非文本流的复制
@Test
public void BufferedStreamTest() throws IOException {
//拿出文件
File srcFile = new File( "D:\\ideaproject\\scala\\src\\main\\resources\\WeChat_20190224190015.mp4" );
File descFile = new File( "D:\\ideaproject\\scala\\src\\main\\resources\\求婚视频.mp4" );
//节点流
FileInputStream fis = new FileInputStream( srcFile );
FileOutputStream fos = new FileOutputStream( descFile );
//缓冲流
BufferedInputStream bis = new BufferedInputStream( fis );
BufferedOutputStream bos = new BufferedOutputStream( fos );
byte[] cbuf = new byte[1024];
int len;
while ((len = bis.read( cbuf )) != -1) {
bos.write( cbuf, 0, len );
}
bis.close();
bos.close();
}
//实现文件复制
@Test
public void copyFileWithBuffered() throws Exception {
//实例化File
File srcFile = new File( "D:\\ideaproject\\scala\\src\\main\\resources\\hao.txt" );
File descFile = new File( "D:\\ideaproject\\scala\\src\\main\\resources2\\hao.txt" );
//输入输出流
FileInputStream inputStream = new FileInputStream( srcFile );
FileOutputStream fileOutputStream = new FileOutputStream( descFile );
//缓冲流
BufferedInputStream bufferedInputStream = new BufferedInputStream( inputStream );
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream( fileOutputStream );
//缓存数组
byte[] cbuf = new byte[1024];
int len;
while ((len = bufferedInputStream.read( cbuf )) != -1) {
bufferedOutputStream.write( cbuf, 0, len );
bufferedOutputStream.flush();
}
bufferedInputStream.close();
bufferedOutputStream.close();
}
}