在之前的FileInputSream以及FileOutputStream不带缓冲的操作,也就是每读入一个字节或数组就要写入,由于涉及磁盘的IO操作相比内存的操作要慢的的多,所以不带缓冲的流效率很低。带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多!下面我们就来了解一下缓冲字节流的。
BuferedInputSream 字节缓冲输入流
构造方法
- BufferedInputStream(InputStream in)
创建一个 BufferedInputStream和保存它的参数,输入流 in,供以后使用.
*BufferedInputStream(InputStream in, int size) --不常用
创建一个具有指定的缓冲区大小 BufferedInputStream,并保存它的参数,输入流 in,供以后使用。
常用方法
- int read()
看到的 InputStream的 read方法一般相同。 从输入流读取下一个数据字节。字节的值范围在 0到 255一 int返回。如果没有可用的字节,因为已到达流的末尾,则返回值 -1。此方法块,直到输入数据可用,流的结束被检测到,或抛出异常。 - int read(byte[] b, int off, int len)
从这个字节的输入流读取到指定的字节数组中的字节,从给定的偏移量开始。 如果基础流的第一 read返回 -1表示文件结束之后这个方法返回 -1。否则,此方法返回实际读取的字节数。 - void close()
关闭此输入流并释放与流关联的任何系统资源。
BuferedOutputStream 字节缓冲输出流
关键字段
protected byte[] buf; //内置缓存字节数组、用于存放程序要写入out的字节
protected int count; //内置缓存字节数组中现有字节总数
构造函数
- BufferedOutputStream(OutputStream out); //使用默认大小、底层字节输出流构造bos。默认缓冲大小是 8192 字节( 8KB )
- BufferedOutputStream(OutputStream out, int size); //使用指定大小、底层字节输出流构造bos
常用方法
void flush(); 将写入bos中的数据flush到out指定的目的地中、注意这里不是flush到out中、因为其内部又调用了out.flush()
write(byte b); 将一个字节写入到buf中
write(byte[] b, int off, int len); 将b的一部分写入buf中
BufferedOutputStream
没有自己的close
方法,当他调用父类FilterOutputStrem
的方法关闭时,会间接调用自己实现的flush
方法将buf中残存的字节flush到out中。
查看BufferedOutputStream的源代码,发现所谓的buffer其实就是一个byte[]。
BufferedOutputStream的每一次write其实是将内容写入byte[],当buffer容量到达上限时,会触发真正的磁盘写入。
而另一种触发磁盘写入的办法就是调用flush()了。
注意
1.BufferedOutputStream在close()时会自动flush
2.BufferedOutputStream在不调用close()的情况下,缓冲区不满,又需要把缓冲区的内容写入到文件或通过网络发送到别的机器时,才需要调用flush.
实战构建-赋值文本文件
public static void BufferIntOutStreamDemoTest(){
BufferedInputStream bufferedInputStream = null ;
BufferedOutputStream bufferedOutputStream = null ;
try{
bufferedInputStream = new BufferedInputStream(new FileInputStream(".\\src\\IntOutTest\\luo.txt"));
bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(".\\src\\IntOutTest\\luocopy.txt")) ;
byte[] bytes = new byte[1024];// 一次读取一个字节
int length = 0;// 实际读取数
while ((length =bufferedInputStream.read(bytes))!= -1){
bufferedOutputStream.write(bytes);
}
}catch (FileNotFoundException fileNotFoundException){
fileNotFoundException.printStackTrace();
}catch (IOException ioException){
ioException.printStackTrace();
}finally {
if (bufferedOutputStream != null& bufferedInputStream != null) {
try {
bufferedOutputStream.close();
//fileOutputStrea.close();
bufferedInputStream.close();
//fileInputStream.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
}