A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯超 高级黑马   /  2014-7-20 23:59  /  2808 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 冯超 于 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, 下载次数: 37)

io.png

12 个回复

倒序浏览
混点经验
回复 使用道具 举报

不说一下 看懂如何?
回复 使用道具 举报
写到博客里也不错啊
回复 使用道具 举报
路过的
回复 使用道具 举报
龙飞九天 发表于 2014-7-21 17:33
写到博客里也不错啊

谢谢 你的建议!
回复 使用道具 举报
楼主,你示意图应该是字符流写入文件流程图而不是字节流吧
回复 使用道具 举报 1 0
冯超 高级黑马 2014-7-24 16:22:45
8#
奋斗的小耗子 发表于 2014-7-22 00:54
楼主,你示意图应该是字符流写入文件流程图而不是字节流吧

恩··笔误!
回复 使用道具 举报
这个不错,

回复 使用道具 举报
路过,谢谢楼组
回复 使用道具 举报
你是在这你写博客吗??
回复 使用道具 举报
有点少,你可以看看IO流的整体框架,这样不容易理解,
回复 使用道具 举报
HPU--spring87 发表于 2014-7-25 22:08
有点少,你可以看看IO流的整体框架,这样不容易理解,

体系 没必要看,了解底层的接口就够了,体系庞大 无非就是继承这些接口,看懂规范的意义比你实际去读体系有意思的多,别人搞出来了 是因为用的多而已··各种流无非是为了需求更好的实现而设计出来的1
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马