「Java」「JAVA」字节流、字符流、缓冲流、转换流、内存流、字符编码( 四 )
因此 , 我们可以准备一个内存缓冲区 , 程序每次调用write()方法时 , 会将数据先写到内存缓冲区中 , 暂存于缓冲区中;当内存缓冲区满后 , 系统才把缓冲区中暂存的数据一次性写出到磁盘文件中 。 这样就能减少直接操作本地文件系统的频率 , 使得系统性能得以提升 。
flush()方法
flush() , 刷新操作 , 输出流中都有flush方法 。 该方法的作用正是把缓冲区中暂存的数据一次性写出到磁盘文件中 。
使用缓冲区的好处:
- 提高CPU使用率 , 提高系统的执行性能;
- 有机会回滚写入的数据 , 能避免一定的脏数据;
- 缓冲区大小一般使用容量整数倍 , 可以提高IO性能;
资源关闭资源关闭分为手动关闭和自动关闭两种:
- 手动关闭:手动调用流的close()方法;
- 自动关闭:不需要手动调用close方法 , 不过 , 前提是资源对象实现了AutoClose接口;
资源关闭案例
资源手动关闭
资源自动关闭
包装类/缓冲流字节缓冲输入流 , BufferedInputStream , 案例代码如下:
? 字节缓冲输入流案例
字节缓冲输出流 , BufferedOutputStream , 案例代码如下:
字节缓冲输出流 案例
字符缓冲输入流 , BufferedReader , 案例代码如下:
字符缓冲输入流 案例
字符缓冲输出流 , BufferedWriter , 案例代码如下:
字符缓冲输出流 案例
字节流、缓冲流性能测试比较:
字节流、缓冲流性能测试比较
testSingleByteStream
testSingleBufferedStream
testMultiByteStream
testMultiBufferedStream
上述测试运行结果如下:
字节流、缓冲流性能测试比较 结果
性能孰高孰低 , 测试结果已经很能说明问题了 。
转换流由于字节流和字符流同时存在 , 有时候会把二者结合起来使用 , 甚至在二者之间实现转换;为了实现这样的功能 , Java IO中提供了字节流和字符流的适配器:
- InputStreamReader:可以把InputStream转换为Reader;
- OutputStreamWriter:可以把OutputStream转换为Writer;
转换流 案例
为什么只有字节转字符流 , 却没有字符转字节流呢?原因也很简单:
- 字节流可以操作一切文件 , 包括纯文本文件、二进制文件;
- 字符流是对字节流的增强 , 是用来操作纯文本使用的;
数组流/内存流面向字节的数组流/内存流:ByteArrayInputStream和ByteArrayOutputStream;该“流”会把数据暂存到内存中 , 以便实时读写 , 读写时使用的字节类型(byte[
);
- ByteArrayInputStream:把数据从程序输出到内存中;
- ByteArrayOutputStream:把数据从内存读取到程序中;
面向字节的数组流/内存流 案例
推荐阅读
- 『Java』java数据结构系列——什么是数据结构
- 『Java』马云:成功人跟普通人差不多,但这三点我一定要分享给所有年轻人
- #Java#java线程到底有多少种状态?
- #智能手表#1、初识java-1
- [华为]有朋友问我“JAVA全栈”、“互联网架构师”和“JAVAEE”到底是什么?
- 「javascript」这边走Javascript了解一下
- 「华为」一篇有趣的Java class
- struts@Java面试之项目面试问题——不看面试会后悔的
- 「Java」六面蚂蚁金服,唬住了面试官要了30K;其实Java面试也没那么难
- Java@23种java设计模式之:建造者模式、工厂方法模式、抽象工厂模式!