Java——IO系统概览

对程序语言的设计者来说,创建一个好的输入/输出(IO)系统是一项艰难的任务。这艰难主要来自于要涵盖I/O的所有可能性。不仅存在各种I/O源端和想要与之通信的接收端(源端/接收端:文件、控制台和网络连接等),而且它们之间可能还需要以不同的方式进行通信(顺序、随机存取、缓冲、二进制、按字符、按行和按字等)

Java类库的设计者通过创建大量的类来解决这个难题。在Java 1.0版本之后,Java的I/O类库发生显著改变,在原来面向字节的类中添加了面向字符和基于Unicode的类。在Java 1.4版本中,添加了nio类进来为了改进性能以及功能。因此,在熟练使用Java I/O类库之前,我们需要先学习相当数量的I/O类。

下面将概述Java的I/O类库中的类的含义以及使用方法。

I/O类库继承框架

Java——IO系统概览

这里用相同的色号的标注表示这个类的功能相似(同时标注了输入和输出)。

输入和输出

什么是I/O流?

我们可以发现很多的类名都跟着一个Stream的后缀,即流。编程语言的I/O类库中也经常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者有能力接收数据的接收端对象。“流”屏蔽了实际I/O设备中处理数据的细节。 例如,我们使用Java通过Http协议远程访问网络资源,获取网络数据(这叫做输入)。我们的主机与服务器就如同下图的管道两端的点,服务器响应给我们的数据,就通过这根管道流向我们。因为输入/输出的方式类似于流水在水管中流动,我们就称输入/输出为输入流/输出流。

Java——IO系统概览

输入和输出是站在程序(计算机内存)的角度来讲的。程序读取外部的数据叫做输入,程序将数据送出外部叫做输出。

查看JDK文档我们可以知道,任何继承自InputStream和Reader的类都含有read方法,用于读取单个的字节或者字节数组;任何继承自OutputStream和Writer的类都含有Write方法,用于写单个的字节和字节数组。但是,我们通常都不用这些方法,这些方法之所以存在是因为可以供其他类使用。在Java中我们很少创建单一的流对象,而是通过叠合多个对象来提供所期望的功能(装饰器模式)。

InputStream 和 OutputStream

在Java 1.0中,类库的设计者限定与输入有关的类都应该从InputStram继承,与输出有关的类都应该从OutputStream继承。

InputStream类型

InputStream是用来表示从不同的数据源产生输入的类。这些数据源包括:字节数组、String对象、文件、管道、一个由其他种类的流组成的序列方便我们可以将它们收集合并到一个流内和其他数据源,如Internet连接等。

每一种数据源都有相应的InputStream子类。FilterInputStream也属于一种InputStream,是装饰器类的基类,装饰器类可以将属性和有用的接口与输入流连接起来,为输入流提供更加丰富的功能。

OutputStream类型

OutputStream是用来表示程序输出要去往的地方:字节数组、文件或者管道。FilterOutputStream是属于OutputStream的,也是装饰器类的基类,“装饰器”类将属性和有用的接口与输出流连接了起来,为输出流提供更加多样的功能。

Reader和Writer

Java 1.1对基本的I/O类库进行了重大的修改,添加了Reader和Writer类以及继承自它们的子类。一眼看到Reader和Writer可能会认为是用于替代InputStream和OutputStream的类。但是,事实并非如此,尽管一些原始的流类库不再被使用。但是InputStream和OutputStream在以面向字节形式的I/O中仍然可以提供极有价值的功能,Reader和Writer则提供兼容Unicode与面向字符的I/O功能

装饰器类FilterInputStream和FilterOutputStream

FilterInputStream和FilterOutputStream用来提供装饰器类的接口以控制特定的输入流(InputStream)和输出流(OutputStream)两个类。

通过FilterInputStream从InputStream中读取数据

FileterInputStream类可以完成两种不同的事情。

其中,DataInputStream可以直接读取DataOutputStream写入文件的基本数据类型和String对象(使用以read开头的方法),二者搭配,我们就可以通过数据“流”,将基本类型的数据从一个地方迁移到另外一个地方

DataInputStream和DataOutputStream的构造函数要求传入一个InputStream或者OutpurStream对象,于是我们就传入文件对象以做示范。

Java——IO系统概览

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgdyfw.html