业务系统 java 类图_Java I/O系统----------- 类图框架

流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象,屏蔽了实际的I/O设备中处理数据的细节。

Java类库中的I/O类分成输入和输出两部分,通过继承,任何自InputStream或Reader派生而来的类都含有名为read()的基本方法,用于读取单个字节或者字节数组。同样,任何自OutputStream或Writer派生而来的类都含有名为write()的基本方法,用于写单个字节或者字节数组。但是,通常不会用到这些方法,它们之所以存在是因为别的类可以使用它们,以便提供更有用的接口。因此,很少使用单一的类来创建流对象,而是通过叠合多个对象来提供所期望的功能(这就是装饰器设计模式)。实际上,Java中“流”类库让人迷惑的主要原因就在于:创建单一的结果流,却需要创建多个对象。

下面按照这些类的功能对它们进行分类。在Java 1.0中,与输入有关的类都应该从InputStream继承,而与输出有关的类都应该从OutputStream继承。

一、InputStream类型

InputStream的作用是用来表示那些从不同数据源产生输入的类,这些数据源包括:

1)字节数组

2)String对象

3)文件

4)“管道”,工作方式与实际管道相似,即,从一端输入,从另一端输出

5)一个由其他种类的流组成的序列,以便可以将它们收集合并到一个流内。

6)其他数据源,如Internet连接等

每一种数据源都有相应的InputStream子类。另外,FilterInputStream也属于一种InputStream为“装饰器”类提供基类,其中,“装饰器”类可以把属性或有用的接口与输入流连接在一起。

二、OutputStream类型

OutputStream类别的类决定了输出所要去的目标,这些目标包括:

1)字节数组

2)文件

3)“管道”

每一种目标都有相应的OutputStream子类。另外,FilterOutputStream也属于一种OutputStream为“装饰器”类提供基类,其中,“装饰器”类可以把属性或有用的接口与输入流连接在一起。

三、添加属性和有用的接口         Java I/O类库需要多种不同功能的组合,这正是使用装饰器模式的理由所在,这也是Java I/O类库里存在filter(过滤器)类的原因所在,抽象类filter是所有装饰器类的基类。装饰器必须具有和它所装饰的对象相同的接口,但也可以扩展接口,而这种情况只发生在个别filter类中。

但是,装饰器模式也有一个缺点:在编写程序时,它给我们提供了相当多的灵活性(可以很容易地混合和匹配属性),但是它同时也增加了代码的复杂性。Java I/O类库操作不便的原因在于,必须创建许多类——“核心”I/O类型加上所有的装饰器,才能得到所希望的单个I/O对象。

FilterInputStream和FilterOutputStream分别自I/O类库中的基类InputStream和OutputStream派生而来,这两个类是装饰器的必要条件(以便能为所有正在被修饰的对象提供通用接口)。

1 通过FilterInputStream从InputStream读取数据

DataInputStream允许读取不同的基本类型数据以及String对象。其他FilterInputStream类则在内部修改InputStream的行为方式:是否缓冲,是否保留它所读过的行,以及是否把单一字符推回输入流等等。

2 通过FilterOutputStream向OutputStream写入数据

四、Reader和Writer

Java1.1 对基本的I/O流类库进行了重大的修改,设计Reader和Writer继承层次结构主要是为了国际化。老大的I/O流继承层次结构仅支持8位字节流,并且不能很好处理16位的Unicode字符。由于Unicode用于字符国际化,所以添加Reader和Writer继承层次就是为了在所有的I/O操作中都支持Unicode。

Reader和Writer继承层次同样沿用了装饰器模式设计思想——但是并不完全相同。尽管BufferedOutputStream是FilterOutputStream的子类,但是BufferedWriter并不是FilterWriter的子类

五、自我独立的类:RandomAccessFile

RandomAccessFile适用于由大小已知的记录组成的文件,所以可以使用seek()将记录从一处转移到另一处,然后读取或者修改记录。它仅实现了DataInput和DataOutput接口(DataInputStream和DataOutputStream也实现了这两个接口),是一个完全独立的类,从头开始编写其所有的方法(大多数是本地的)。从本质上来说,RandomAccessFile的工作方式类似于把DataInpuStream和DataOutputStream组合起来使用,还添加了一些方法。其中方法getFilePointer()用于查找当前所处的文件位置,seek()用于在文件内移至新位置,length()用于判断文件的最大尺寸。另外,其构造器还需要第二个参数用来指示是“随机读”(r)还是“既读又写”(rw)。它并不支持只写文件。

六、I/O类库类图

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值