黑马程序员技术交流社区
标题: java IO流结构体系 [打印本页]
作者: 冯超 时间: 2014-7-20 23:59
标题: java IO流结构体系
本帖最后由 冯超 于 2014-7-21 00:00 编辑
java IO流的基础知识真的很重要,自己不清楚一些基本的操作,或者不知道他的结构体系,后面的深入你根本不了解。
Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点:
1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系
2. 原始处理器(适配器)与链接流处理器(装饰器)
* InputStream用来进行写操作(写入控制台,写入文本等) OutputStream用来读操作(从文本中读数据等)
对于2的理解我目前不了解,但是对于1中说的他们分别是一套字节输入-输出,字符输入-输出体系,首先你要明白字节流和字符流究竟有什么区别?
a.
字节流:字节流是最基本的,主要用来处理2进制数据,他是按字节来处理的。
字符流:实际上很多数据都是文本,所以才有了字符流的概念。
从字节流转化为字符流是:String s = new String(byte[], 0, length); byte[]数组像String转换的一个过程 从字符流转化为字节流是:byte[] b = s.getBytes()l; String类型转换为byte[]数组的一个过程
b.
字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的
而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,
有个问题,什么叫做缓冲区了?
可以简单地把缓冲区理解为一段特殊的内存。
某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。
在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。
如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。
还有个问题,你凭什么说字节流操作的是文件本身,二字符流是使用的缓冲区?
这个问题简单,模拟一个从文件中写数据的操作。
用字符流:Writer 的实现类FileWriter测试如下:
- public String OutputStreamTest(File file) throws IOException {
- Writer writer = new FileWriter(file);
- String s = "xcscs牛角尖";
-
- writer.write(s);
- writer.flush();
- //writer.close();
-
- return s;
- }
复制代码
测试结果显示:Writer流最后是否关闭或者flush() 都能直接影响你文件中是否已经成功写进去了内容。经过刷新缓冲区或者关闭Writer流都能成功写进内容。而字节流则不会出现这种情况,自己可以去测试。字符流通过缓冲区的流程图如下:
-
io.png
(97.28 KB, 下载次数: 65)
作者: 郭可 时间: 2014-7-21 10:11
混点经验
作者: 冯超 时间: 2014-7-21 10:50
不说一下 看懂如何?
作者: 龙飞九天 时间: 2014-7-21 17:33
写到博客里也不错啊
作者: 七弟 时间: 2014-7-21 21:34
路过的
作者: 冯超 时间: 2014-7-21 22:14
谢谢 你的建议!
作者: 奋斗的小耗子 时间: 2014-7-22 00:54
楼主,你示意图应该是字符流写入文件流程图而不是字节流吧
作者: 冯超 时间: 2014-7-24 16:22
恩··笔误!
作者: m4rquis 时间: 2014-7-25 00:21
这个不错,
作者: 刘高峰 时间: 2014-7-25 04:57
路过,谢谢楼组
作者: 王石 时间: 2014-7-25 18:44
你是在这你写博客吗??
作者: HPU--spring87 时间: 2014-7-25 22:08
有点少,你可以看看IO流的整体框架,这样不容易理解,
作者: 冯超 时间: 2014-7-25 22:23
体系 没必要看,了解底层的接口就够了,体系庞大 无非就是继承这些接口,看懂规范的意义比你实际去读体系有意思的多,别人搞出来了 是因为用的多而已··各种流无非是为了需求更好的实现而设计出来的1
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |