posts - 70,comments - 408,trackbacks - 0

"IO"对程序语言的设计者来说是一项难度极高的任务.编程思想中这样说过,可见要把IO彻底搞清楚并非简单之事.我也苦心研究过IO但是还不能完全理解.只是理解了主要的一些功能.File类的名字极具的富有欺骗性,刚看或许会认为是一个关于文件的类,但它不是.可以用它来表示某个文件的名字,也可以用它来表示目录里的一组文件的名字.如果它表示的是一组文件,那么你还可以用list()方法来进行查询,它返回String数组.File类的功能不仅限于显示文件或者目录.还可以帮你创建心的目录甚至是目录路径.此外还可以用来检查文件的属性,判断文件是否存在,删除文件等等N多功能.个人觉的IO流是J2SE的核心技术之一,虽然J2EE的程序员精通于它,但是掌握基本的流操作和原理也是很有必要的.说了半天什么是"流"呢?所谓"流"就是一种能生成或接受数据的,代表数据的源和目标的对象,流把I/O设备内部的具体操作封装了起来.JDK文档上说到JAVA的I/O类库分成输入和输出两大部分也就是通常说的读和写.所有的InputStream和Reader的派生类都有一个基本的继承来的能读取单个或者byte数组的read()方法.反之所有的OutputStream和Writer的派生类都有一个基本的能写入单个或byte数组的write()方法.

InputStream的任务就是代表那些从各种输入源获取数据的类,这些源主要有byte数组,String对象,文件,管道,流序列,Internet.这些数据源各自都有与之相对应的InputStream的子类.

1)ByteArrayInputStream:以缓冲区内存为InputStream

2)StringBufferInputStream:以String为InputStream

3)FileInputStream:专门用来读文件

4)PipedInputStream:从PipedOutputStream提取数据实现"管道"功能

5)SequenceInputStream:把两个或者多个InputStream合并成一个.

6)FilterInputStream:一个为decorator定义接口用的抽象类.

OutputStream是解决往哪里输出的类,是byte数组,文件或者是管道.

1)ByteArrayOutputStream:在内存里创建一个缓冲区,数据送到流里就是写入这个缓冲区.

2)FileOutputStream:把数据写入文件.

3)PipedOutputStream:写入这个流的数据,最终都会变成与之相关联的PipedInputStream的数据源.

4)FilterOutputStream:一个能decorator提供接口的抽象类.

自从java1.1对最底层的I/O流类库作了重大修改之后,我们看到了Reader和Writer,这个时候我们也许会想reader和writer是不是要取代InputStream和OutputStream呢?不过事实并非如此,虽然InputStream和OutputStream的部分功能已经被淘汰(你继续用编译会有异常),但是仍然有很多东西是有价值的,它们是面向byte的I/O流,也就是字节流.而Reader和Writer则提供的是Unicode的兼容,也就是字符类.Reader和Writer(我称为读流和写流)我觉的主要的用途在与国际化问题.而原来的I/O类库只支持8位的字节,也就是输入输出流,因为不能很好的处理16位的unicode字符.这里说一个概念就是"标准I/O"是Unix的概念,它的意思是一个程序使用一个信息流.所有输入都是从"标准输入"流进来的,输出都是从"标准输出"出去的.错误的消息有"标准错误"标准I/O的优点是可以很容易的和程序串连起来,并且把一个程序的输出当作另一个程序的输入.新IO是JAVA1.4引入的一个新的I/O类库,位于"java.nio.*"包,这么做只有一个目的就是速度.不过至于这个包中的类我还没具体的使用过HOHO.

JAVA的"对象系列化"能让一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象的时候,就可以从byte数据恢复出来,简单的说就是把对象保存在外部文件中.而且这种方法也是跨平台的,你无需考虑自己的对象文件应用于什么平台,这些技术细节虚拟机为我们实现了.序列化一个对象还是比较简单的,只要让它实现Serializable接口就行了(这是一个标记接口(tagging interface)没有方法的接口).但是,当语言引入序列化概念之后,它的很多标准类库的类,包括primitive的wrapper类,所有的容器类,以及别的很多类,都会相应地发生改变.甚至连Class对象都会被序列化.要想序列化对象,你必须先创建一个OutputStream,然后把它嵌进ObjectOutputStream.这时,你就能用writeObject( )方法把对象写入OutputStream了.读的时候,你得把InputStream嵌到ObjectInputStream里面,然后再调用readObject( )方法.不过这样读出来的,只是一个Object的对象.对象序列化的重要用途就是Bean技术和RMI(远程方法调用).

如果想深刻学习掌握JAVA的I/O流,我在这里推荐Elliotte Rusty Harold写的<<Java I/O>>(O’Reilly, 1999)这本书.

posted on 2005-11-16 19:26 我心依旧 阅读(5186) 评论(6)  编辑  收藏

FeedBack:
# re: 浅谈IO流
2006-04-30 16:01 | bugSharp
还是不太明白什么是"流"啊  回复  更多评论
  
# re: 浅谈IO流
2008-01-24 12:30 | 塔塔
写的逻辑有点乱啊...  回复  更多评论
  
# re: 浅谈IO流
2008-03-06 15:34 | javamanlcy
流==数据?  回复  更多评论
  
# re: 浅谈IO流
2008-06-03 22:27 | 变繁为简
其实IO是输入输出的意思 很多人喜欢把问题复杂化。
原理很简单 就是把源文件读出在写到目标文件中  回复  更多评论
  
# re: 浅谈IO流
2009-06-24 18:19 | nhh
还是不太明白什么是"流"啊   回复  更多评论
  
# re: 浅谈IO流
2009-06-24 18:20 | nhh
其实IO是输入输出的意思 很多人喜欢把问题复杂化。
原理很简单 就是把源文件读出在写到目标文件中  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: