「Java」「JAVA」字节流、字符流、缓冲流、转换流、内存流、字符编码( 四 )


因此 , 我们可以准备一个内存缓冲区 , 程序每次调用write()方法时 , 会将数据先写到内存缓冲区中 , 暂存于缓冲区中;当内存缓冲区满后 , 系统才把缓冲区中暂存的数据一次性写出到磁盘文件中 。 这样就能减少直接操作本地文件系统的频率 , 使得系统性能得以提升 。
flush()方法
flush() , 刷新操作 , 输出流中都有flush方法 。 该方法的作用正是把缓冲区中暂存的数据一次性写出到磁盘文件中 。
使用缓冲区的好处:

  1. 提高CPU使用率 , 提高系统的执行性能;
  2. 有机会回滚写入的数据 , 能避免一定的脏数据;
  3. 缓冲区大小一般使用容量整数倍 , 可以提高IO性能;
对于字节流 , flush方法不是都有作用(部分字节流才有作用) , 对于字符流、缓冲流则都起作用 。 如果我们调用close方法关闭系统资源 , 那么 , 系统在关闭资源前 , 会先调用flush方法 。
资源关闭资源关闭分为手动关闭和自动关闭两种:
  • 手动关闭:手动调用流的close()方法;
  • 自动关闭:不需要手动调用close方法 , 不过 , 前提是资源对象实现了AutoClose接口;

资源关闭案例
资源手动关闭
资源自动关闭
包装类/缓冲流字节缓冲输入流 , BufferedInputStream , 案例代码如下:
? 字节缓冲输入流案例
字节缓冲输出流 , BufferedOutputStream , 案例代码如下:
字节缓冲输出流 案例
字符缓冲输入流 , BufferedReader , 案例代码如下:
字符缓冲输入流 案例
字符缓冲输出流 , BufferedWriter , 案例代码如下:
字符缓冲输出流 案例
字节流、缓冲流性能测试比较:
字节流、缓冲流性能测试比较
testSingleByteStream
testSingleBufferedStream
testMultiByteStream
testMultiBufferedStream
上述测试运行结果如下:
字节流、缓冲流性能测试比较  结果
性能孰高孰低 , 测试结果已经很能说明问题了 。
转换流由于字节流和字符流同时存在 , 有时候会把二者结合起来使用 , 甚至在二者之间实现转换;为了实现这样的功能 , Java IO中提供了字节流和字符流的适配器:
  • InputStreamReader:可以把InputStream转换为Reader;
  • OutputStreamWriter:可以把OutputStream转换为Writer;
以下便是这个适配器—“转换流”的使用案例 , 案例通过文件的拷贝操作来体现 , 在读写的过程中 , 均使用了特定编码 。 案例代码实现如下:
转换流 案例
为什么只有字节转字符流 , 却没有字符转字节流呢?原因也很简单:
  • 字节流可以操作一切文件 , 包括纯文本文件、二进制文件;
  • 字符流是对字节流的增强 , 是用来操作纯文本使用的;
字节流和字符流之间并不对等 , 无法实现转换 , 就比如C++程序可以运行C程序 , 但C程序却不能运行C++程序 。
数组流/内存流面向字节的数组流/内存流:ByteArrayInputStream和ByteArrayOutputStream;该“流”会把数据暂存到内存中 , 以便实时读写 , 读写时使用的字节类型(byte[
);
  • ByteArrayInputStream:把数据从程序输出到内存中;
  • ByteArrayOutputStream:把数据从内存读取到程序中;
代码案例如下:
面向字节的数组流/内存流  案例


推荐阅读