Chapter 1 初窥Java IO类结构

来源:互联网 发布:手机淘宝图片保存位置 编辑:程序博客网 时间:2024/05/17 06:24

1 背景

I/O问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动。这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的瓶颈都是 I/O 。而I/O涉及到的问题比较庞杂,包括:文件、磁盘、网络、字符编码等。

Java IO在java.io包下面大约有80个相关的操作类,并且其设计十分精巧,用到了设计模式中的装饰设计模式。通过装饰设计模式,Java IO提供加强的读写功能(例如缓冲区)。加强Java IO的相关知识对提高Java程序的设计很有帮助。

2 Java IO类图

从Java IO的类图可以看到IO流主要分为字符流和字节流两大类,其中字符流包括从文本文件或I/O设备中读入的字符,字节流包括从图片、视频等二进制文件中读入的字节数据。其实在底层实现上,字符流是用字节流实现的,只不过加上了字符编码和本地化等机制。

而从流的流向方面,IO流又可以分为输入流和输出流两类。学习Java IO可以从流的种类和流的方向两方面来进行学习。

3 一些基类

3.1 字符输入流

字符输入流的基类是抽象类Reader,其类签名为:public abstract class Reader implements ReadableCloseable。这个类的核心方法是重载的几个read方法,用于从字符流中读入字符数据。

其中,子类必须实现的抽象函数有两个:即read(char[], int, int)和close()。

3.2 字符输出流

字符输出流的基类是抽象类Writer,其类签名为:public abstract class Writer implements AppendableCloseableFlushable。该类的核心方法是重载的几个write方法,用于将数据写入字符流中。和Reader类似,其实现了Closeable的接口,并且还实现了Appendable和Flushable接口,其中前者用于追加写入功能(如文件的追加写入),后者用于刷新功能,因为调用写入函数只是把数据写入流之中即内存之中,而并没有持久化,刷新功能可将内存中的数据持久化到目的文件或I/O设备中。

其中,子类必须实现的抽象函数有三个:write(char[], int, int), flush()和close()。

3.3 字节输入流

字节输入流的基类是抽象类InputStream,其类签名为:public abstract class InputStream implements Closeable。这个类的方法和属性与Reader类似,只不过流的种类变成字节流了,这从类的签名中也可以看出来,该类并没有实现Readable接口,因为字节流数据并不具有可读性(相对于用户)。

其中,子类必须实现的抽象函数只有一个:read(),需要注意的是close()函数并没有被抽象而且方法体中没有任何内容。

另外InputStream类还有几个特别的函数:

(1)available方法:public int available() throws IOException,代表的是在不阻塞的情况下,可以读入或者跳过(skip)的字节数。

(2)skip方法:public long skip(long n) throws IOException,代表试图跳过当前流的n个字节,返回实际跳过的字节数。如果n为负数,返回0。

(3)mark方法:public synchronized void mark(int readlimit),该方法用于在流的当前位置做个标记,参数readLimit指定这个标记的“有效期“,如果从标记处开始往后,已经获取或者跳过了readLimit个字节,那么          这个标记失效,不允许再重新回到这个位置(通过reset方法)。

(4)reset方法:public synchronized void reset() throws IOException,该方法用于重定位到最近的标记。如果在这之前mark方法从来没被调用,或者标记已经无效,在抛出IOException。如果没有抛出这个异              常,将当前位置重新定位到最近的标记位置。

(5)markSupported方法:public boolean markSupported(),代表检测当前流对象是否支持标记。是返回true。否则返回false。比如InputStream不支持标记,而BufferedInputStream支持。

3.4 字节输出流

字节输出流的基类是抽象类OutputStream,其类签名为:public abstract class OutputStream implements CloseableFlushable。这个类的方法和属性与Writer类似,只不过流的种类变成字节流了,并且有个不同的是其并没有实现Appendable接口。

其中,子类必须实现的抽象函数只有一个:write(int b),flush()和close()函数并没有抽象化而且方法体中没有任何内容。

4 基类的共性特点

(1)都是抽象类,也就是说不能实例化对象,必须实例化其子类。

(2)都有close方法,用于释放相关的资源。

(3)绝大部分的类都抛出IOException,该异常时编译时异常,所以必须try...catch...finally处理或者上抛,而当出现异常时也必须执行close方法释放资源,所以close方法应该在finally代码块中实现,关于这一点在后续介绍具体的子类时会详细说明。

0 0