黑马程序员技术交流社区

标题: 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测试如下:
  1.         public String OutputStreamTest(File file) throws IOException {
  2.                 Writer writer = new FileWriter(file);
  3.                 String s = "xcscs牛角尖";
  4.                
  5.                 writer.write(s);
  6.                 writer.flush();
  7.                 //writer.close();
  8.                
  9.                 return s;
  10.         }
复制代码


                   测试结果显示:
Writer流最后是否关闭或者flush() 都能直接影响你文件中是否已经成功写进去了内容。经过刷新缓冲区或者关闭Writer流都能成功写进内容。而字节流则不会出现这种情况,自己可以去测试。字符流通过缓冲区的流程图如下:


io.png (97.28 KB, 下载次数: 65)

io.png

作者: 郭可    时间: 2014-7-21 10:11
混点经验
作者: 冯超    时间: 2014-7-21 10:50
郭可 发表于 2014-7-21 10:11
混点经验

不说一下 看懂如何?
作者: 龙飞九天    时间: 2014-7-21 17:33
写到博客里也不错啊
作者: 七弟    时间: 2014-7-21 21:34
路过的
作者: 冯超    时间: 2014-7-21 22:14
龙飞九天 发表于 2014-7-21 17:33
写到博客里也不错啊

谢谢 你的建议!
作者: 奋斗的小耗子    时间: 2014-7-22 00:54
楼主,你示意图应该是字符流写入文件流程图而不是字节流吧
作者: 冯超    时间: 2014-7-24 16:22
奋斗的小耗子 发表于 2014-7-22 00:54
楼主,你示意图应该是字符流写入文件流程图而不是字节流吧

恩··笔误!
作者: 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
HPU--spring87 发表于 2014-7-25 22:08
有点少,你可以看看IO流的整体框架,这样不容易理解,

体系 没必要看,了解底层的接口就够了,体系庞大 无非就是继承这些接口,看懂规范的意义比你实际去读体系有意思的多,别人搞出来了 是因为用的多而已··各种流无非是为了需求更好的实现而设计出来的1




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2