Archive

Posts Tagged ‘IO’

Java IO 简介

January 18th, 2011 leeing No comments

Java.io包是用术语流(stream)来定义的,流是有序的数据序列,它有一个源(输入流)或一个目的地(输出流) ,它代表任何有能力产生数据的数据源对象或者有能力接收数据的接收端对象,它屏蔽了实际I/O设备中处理数据的细节。

Java.nio包是用术语Channel 和buffer来定义I/O的。缓冲区是可以从中读取或写入的数据存储(类似于数组),通道表示的是能够执行I/O操作的实体的连接,这些实体包括缓冲区,文件和套接字。NIO和OIO的区别主要在于Channel允许不阻塞的I/O操作和可中断的阻塞操作,这对于高吞吐量的服务器应用是至关重要的。

Java.net包是基于对套接字的使用,用一种基于流,或者基于通道的模型提供了对网络I/O的特殊支持。

Java.io中的字符流,字符是指16位的UTF-16字符。

关闭流可以释放该流可能使用过的资源(如文件描述符),这些资源在不再使用时尽快回收;而如果某个流未被显式地关闭,则继续持有这些资源。流类可以定义finalize方法,但是通常在完成流的操作以后,就应该将其关闭。如果流已经被关闭,之后在其上操作会触发IOException,而关闭一个已经被关闭了的流则不会有任何的影响。(即流可以重复关闭,但不能在关闭之后继续使用

所有的字节流都具有相同的同步策略和并发行为。

下面主要说明一些特别要注意的方法:

InputStream

public abstract int read() throws IOException

这个是唯一需要重写的方法,用以读取数据的一个单个字节,并返回0~255之间的整数,如果已经达到流的末尾,则将返回-1。注意,这个方法将发生阻塞直到可获取输入,到达流的末尾,或者抛出异常。这个方法返回的是一个int而不是byte值,因为它需要返回所的有效的字节值加上一个表示末尾的标志值,这就要求标志值要超出byte的范围,所以就采用了更大的int。注意 System.in就是InputStream类型的。

OutputStream

public abstract void write(int b) throws IOException

将b作为一个字节写入,由于是int类型,只有此整数的最低8位会被写入,此方法将阻塞直至字节写入完成。

InputStream和OuputStream分别只要求子类实现其read和write方法,因为其它read,write方法都是在此基础上定义的,大多数流都可以通过覆盖read或write方法来提高性能,而OutputStream中的flush和close方法的默认实现通常都需要在特定的流中进行恰当的覆盖,尤其是被缓冲的流,可能需要在关闭的时候进行刷新。

设计Reader和Writer类继承层次主要是为了国际化,因为16位的Unicode用于字符国际化,所以添加这两个类层次就是为了在所有的I/O操作中支持Unicode,此外,新类库的设计使得它的操作比旧类库要快。在应用中,最明智的做法应该是:尽量尝试使用Reader和Writer,一旦程序代码无法成功编译,才使用面向字节的类库。例如,java.util.zip就是只面向字节的。

Read more…

Categories: Java Tags: ,