Java核心API之缓冲字节流使用介绍
1、缓冲字节流之BufferedOutputStream的使用介绍
首先,小编要强调一点,那就是BufferedOutputStream是字节流中的处理流,主要是处理低级流的。
其次,操作字节输入流写入磁盘数据,增大写出次数降低了写出效率,这种情况可以使用缓冲输出流一次性批量写出若干数据减少写出次数来提高写出效率。
最后,缓冲输出流其内部维护一个缓冲区(其实际上是一个字节数组),进行写出操作时,先将数据存入缓冲区,缓冲区装满后,缓冲区把数据一次性全部写出。
参考代码如下:
/*
* BufferedOutputStream有两个构造方法,分别是
* BufferedOutputStream(OutputStream out)
* 该构造方法只需要传入一个输出流
*
* BufferedOutputStream(OutputStream out,int size)
* 该构造方法需要传入两个参数,第一个参数是输出流,第二个参数是缓冲区大小,即字节数组的大小
*
*/
@Test
public void testBOS() throws Exception{
FileOutputStream fos = new FileOutputStream("test_buffered.txt");
//构造方法BufferedOutputStream(OutputStream out)的实例
BufferedOutputStream bos = new BufferedOutputStream(fos);
//构造方法BufferedOutputStream(OutputStream out,int size)的实例
BufferedOutputStream bos2 = new BufferedOutputStream(fos,10); }
分析:缓冲输出流BufferedOutputStream作为一种高级流(处理流),其构造参数往往是一个低级流。

2、缓冲输出流BufferedOutputStream的write()方法
小编带领大家学习过RandomAccessFile,FileOutputStream,FileInputStream类的使用,从中可以发现它们的write()和read()方法基本是一样的。
BufferedOutputStream和FileOutputStream有共同的父类OutputStream,所以它们的write()可以说基本也是一样的。
参考代码如下:
/*
* BufferedOutputStream有几个write()
* void write(int b)
* void write(byte[] b)
* void write(byte[] b,int offset,int len)
*/
@Test
public void testBOSWrite() throws Exception{
FileOutputStream fos = new FileOutputStream("test_buffered.txt"); BufferedOutputStream bos = new BufferedOutputStream(fos);
//void write(int b)
bos.write(1);
byte[] b = "HelloWorld".getBytes("UTF-8");
//void write(byte[] b)
bos.write(b);
bos.close();
}
分析:流关闭之前,即bos.close()之前,缓冲输出流会将缓冲区内容一次性写出,运行结果参照下图。


3、缓冲输出流BufferedOutputStream的flush()方法
缓冲输出流虽然可以提高读写效率,但是保存在缓冲区的数据直到缓冲区满后才写出,为了数据能够即时写出,可以使用flush方法。
/*
* void flush()
* 该方法清空缓冲区,将缓冲区中的数据强制写出
*/
@Test
public void testFlush() throws Exception{
FileOutputStream fos = new FileOutputStream("test_buffered.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] b = "HelloWorld".getBytes("UTF-8");
//该方法只是将字节数组写入缓冲区中,并没有将字节数组写入文件中
bos.write(b);
//通过该方法将缓冲区中的数据强制写出
bos.flush();
}

4、缓冲输入流BufferedInputStream使用介绍
读取数据时以字节为单位读取数据,这样增加读写次数降低读写效率,可以通过提高一次性读取字节数量减少读写效率,提高读取效率。
BufferedInputStream与BufferedOutputStream一样,其内部维护一个缓冲区,即字节数组,该流会一次行读取多个字节存入缓冲区中,缓冲区装满后,逐一的将字节返回,直到缓冲区数据全部读取完毕。
示例代码如下:
/*
* BufferedInputStream有两个构造方法,分别是
* BufferedInputStream(InputStream in)
* 该构造方法只需要传入一个输入流
*
* BufferedInputStream(InputStream in,int size)
* 该构造方法需要传入两个参数,第一个参数是输入流,第二个参数是缓冲区大小,即字节数组的大小
*
*/
public void testBIS() throws Exception{
FileInputStream fis = new FileInputStream("test_buffered.txt");
//构造方法BufferedInputStream(InputStream in)
BufferedInputStream bis = new BufferedInputStream(fis);
int d = -1;
while((d=bis.read())!=-1){
System.out.print((char)d);
}
bis.close();
}

5、缓冲输入流BufferedInputStream的read()介绍
该流的read方法基本与FileInputStream是一致的,有read(int d),read(byte[] b)和read(byte[] b, int off,int len)
示例代码如下:
/*
* 该流有几个常用的read方法
* int read()
* int read(byte[] b)
* int read(byte[] b,int off,int len)
*/
@Test
public void testBISRead() throws Exception{
FileInputStream fis = new FileInputStream("test_buffered.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
//int read()
int d = -1;
while((d=bis.read())!=-1){
System.out.println((char)d);
}
byte[] buf = new byte[10];
//int read(byte[] b)
int dtw = -1;
while((dtw=bis.read(buf))!=-1){
System.out.print(new String(buf,"UTF-8"));
}
//int read(byte[] b,int off,int len)
int dthr = -1;
while((dthr=bis.read(buf,0,10))!=-1){
System.out.println(new String(buf,"UTF-8"));
}
}
运行结果见下图:
