Java IO(十) BufferedInputStream 和 BufferedOutputStream
Java IO(十)BufferedInputStream 和 BufferedOutputStream
一、BufferedInputStream 和 BufferedOutputStream
(一)、BufferedInputStream
BufferedInputStream 是缓冲字节输入流,继承自FilterInputStream,它的作用是为另一个输入流对象提供一些额外的功能。如:缓冲功能,支持 mark(标记)和reset(重置)功能等。
BufferedInputStream 本质上是通过一个内部缓冲区数组实现的。例如,在新建某输入流对应的 BufferedInputStream 后,当我们通过read()读取输入流的数据时,BufferedInputStream会将该输入流的数据分批的填入到缓冲区中。每当缓冲区中的数据被读完之后,输入流会再次填充数据缓冲区;如此反复,直到我们读完输入流数据位置。
BufferedOutputStream 是缓冲字节输入流,继承自FilterOutputStream,它的作用是为另一个输出流对象提供缓冲功能。
二、构造方法
(一)、BufferedInputStream
(二)、BufferedOutputStream
三、常用API
(一)、BufferedInputStream
(二)、BufferedOutputStream
四、缓冲功能
(一)、BufferedOutputStream
BufferedOutputStream 为其它输出流提供缓冲功能。创建BufferedOutputStream 时,我们会通过它的构造函数指定某个输出流为参数。通过字节数组来缓冲数据,当缓冲区满或者用户调用 flush() 函数时,它就会将缓冲区的数据写入到输出流中。
(二)、BufferedInputStream
BufferedInputStream的作用是为其它输入流提供缓冲功能。创建BufferedInputStream时,我们会通过它的构造函数指定某个输入流为参数。BufferedInputStream会将该输入流数据分批读取,每次读取一部分到缓冲中;操作完缓冲中的这部分数据之后,再从输入流中读取下一部分的数据。缓冲中的数据实际上是保存在内存中,从内存中读取数据的速度更快从而提高性能。
分批读取而不一次性读取的好处:
- 缩短读取时间,提高读取性能。
- 减少内存空间占用。
五、实例
private static final byte[] buffer = "abcdefghijklmnopqrstvuwxyz".getBytes(); public static void main(String[] args) { write(); read(); } /** * BufferedOutputStream 测试 */ public static void write() { BufferedOutputStream out = null; try { out = new BufferedOutputStream(new FileOutputStream(new File("test.txt"))); out.write(buffer); } catch (Exception e) { e.printStackTrace(); } finally { try { if (out != null) out.close(); }catch (Exception e) { e.printStackTrace(); } } } /** * BufferedInputStream 测试 */ public static void read() { BufferedInputStream in = null; byte[] bu = new byte[10]; int len = 0; try { in = new BufferedInputStream(new FileInputStream(new File("test.txt"))); int temp = in.read();// 获取单字节数据 System.out.println("temp : " + (char)temp); in.mark(5);// 标记第五个元素 in.skip(10);// 跳过10个字节 len = in.read(bu,0,5);// 获取5字节数据 System.out.println("bu : " + new String(bu,0,len)); in.reset();// 重置 len = in.read(bu,0,5);// 获取5字节数据 System.out.println("bu : " + new String(bu,0,len)); } catch (Exception e) { e.printStackTrace(); } finally { try { if (in != null) in.close(); }catch (Exception e) { e.printStackTrace(); } }
}