IO流

一个可以读取字节序列的对象被称为输入流;一个可以写入字节序列的对象被称为输出流。另一方面,以一个字节为最小读取单位的流称为字节流,以两个字节为最小读取单位的流称为字符流。由于java的字符串采用的unicode编码,所以对文本的读取采用字符流会方便很多。而对其他的数据存储应采用字节流。

输入输出流其实是相对内存而言的。

java中有一些流的类型,其数量超过60种。这些流中有4个流可以称为基类流,分别是InputStream,OutputStream,Reader和Writer,它们都是抽象类,输入流有abstract int read()抽象方法,输出流有abstract void write(int b)抽象方法,它们的子类重写抽象方法,以实现不同需求。

以InputStream为例,其直接子类中有FileInputStream(这是文件读取流),PipedInputStream(管道输入流,要输入输出流结合来用,主要用于线程操作),ByteArrayInputStream(字节数组流,在内存中创建一个数组进行写入),以上都是节点流,即它们都直接数据源相连。直接使用节点流,读取和输入数据不方便,为了更快的读写文件,有了处理流。

处理流我们最熟悉的就属ObjectInputStream和ObjectOutputStream,也就是对象序列化和反序列化,它把要传输的数据分装到一个类中,然后对整个类打包传递。这样做的话就不用我们来设计输入输出规则以区分不同的信息,可以很方便的传输我们需要的数据,包括不同的基本数据类型,以及自己定义的类。

提到处理流就不得不提Filter流。在api中这样描述:FilterInputStream 类本身只是简单地重写那些将所有请求传递给所包含输入流的 InputStream 的所有方法。FilterInputStream 的子类可进一步重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。这些子类提供了不同的流读写规则,这样子就让流变的很灵活,而且这些流之间还能嵌套使用,就能实现功能的叠加。如用DataInputStream可以实现直接基本数据类型读取,BufferedInputStream建立缓存输入以及支持 mark 和 reset 方法的能力,如果new BufferedInputStream(new DataInputStream(new FileInputStream(" . ")))这样子就可以从文件中直接读取基本数据类型,并存在缓冲中。

字符流是以字节流为基础的,所以在创建字符流的时候要调用以字节流为参数的构造方法。

posted on 2015-11-29 23:46  Sampwood  阅读(127)  评论(0)    收藏  举报

导航