Java基础之I/O详解(二)类库设计模式

Java类库的设计者通过创建大量的类来解决I/O系统设计的难题。一开始,可能会对Java I/O系统提供了如此多的类感到不知所措(具有讽刺意味的是,Java I/O设计的初衷是为了避免过多的类) ——–《Thinking in Java》

介于Java I/O类库中数目众多的类,我们有必要清楚这个类库是如何设计的。

分类

Java1.0版本以前,Java中与输入有关的所有类都应该从InputStream这个抽象类继承,而与输出类有关的所有类都应当从OutputStream这个抽象类继承。但是,这种I/O流继承层次结构仅支持8位字节流,并不能很好的处理16位的Unicode字符。由于Unicode用于字符国际化(Java中的char也是16位的Unicode),所以在Java1.0以后添加了ReaderWriter继承层次结构,这样做就是为了在所有的I/O操作中都支持Unicode。

注意,在某些场合(例如音频/视频文件/压缩文件),面向字节的InputStream和OutputStream才是正确的解决方案。所以,最明智的做法是尽量尝试使用Reader和Writer,一旦程序无法成功编译,再使用面向字节的类库。

InputStream

此抽象类是表示字节输入流的所有类的超类。

InputStream抽象类的主要子类有:

  • ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。即允许将内存的缓冲区当做InputStream使用
  • FileInputStream 用于从文件中读取信息
  • PipedInputStream 产生用于写入相关PipedOutputStream的数据,实现“管道化”概念
  • SequenceInputStream 将两个或多个InputStream对象转换成单一InputStream
  • FilterInputStream 抽象类,作为“装饰器”的接口。其中“装饰器”为其他的InputStream类提供有用功能。

注意:除了FilterInputStram类,InputStream类的其他子类都对应与一种数据源。例如:字节数组,文件等。而FilterInoutStream类的出现是因为Java在设计I/O系统时采用了“装饰器”设计模式。(关于装饰器设计模式请参看http://blog.csdn.net/jason0539/article/details/22713711

OutputStream

此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器。

OutputStream的一些子类:

  • ByteArrayOutputStream 此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。即在内存中创建缓冲区,所有送往流的数据都要放置在此缓冲区。
  • FileOutputStream 用于将信息写至文件
  • PipedOutputStream 任何写入其中的信息都会自动作为相关PipedInputStream的输出,实现“管道化”概念。
  • FilterOutputStream 抽象类,作为“装饰器”的接口,其中装饰器为其他OutputStream提供有用功能。

注意:除了FilterOutputStream 类,OutputStream类的其他子类都对应了输出所要去的目标。

FilterInputStream&FilterOutputStream

FilterInputStream和FilterOutputStream是用来提供装饰七类接口以控制特定输入流和输出流的两个类,这两个类是装饰器的必要条件(以便能为所有正在被修改的对象提供调用接口)。而两者的装饰器子类可以来修改“流”以满足某种特殊需要。

FilterInputStream的装饰器子类

  • DataInputStream 与DataOutputStream搭配使用,因此我们可以按照可移植方式从流读取基本数据类型
  • BufferedInputStream 使用它可以防止每次读取时都得进行实际写操作,代表使用缓冲区。
  • PushbackInputStream 具有“能弹出一个字节的缓冲区”,因此可以将读到的最后一个字符回退。

FilterOutputStream的装饰器子类

  • DataOutputStream 与DataInputStream 搭配使用,因此我们可以按照可移植方式向流中写入基本数据类型
  • PrintStream 用于产生格式化输出。其中DataOutputStream处理数据的存储,PrintStream处理显示。
  • BufferedOutputStream 使用它可以防止每次发送数据时都得进行实际写操作,代表使用缓冲区

Reader&Writer

注意:Reader和Writer的继承层次结构与InputStram和OutputStream的集成层次结构非常相似,可对照学习,这里不再详细阐述。

InoutStreamReader&OutputStreamWriter

又是我们必须把来自于“字节”层次结构中的类和“字符”层次结构中的类结合起来使用,为了实现这个目的,要用到适配器类:InoutStreamReader&OutputStreamWriter。InputStreamReader类可以把InputStream转换为Reader,OutputStreamReader类可以把OutputStream转换为Writer。

RandomAccessFile

这是一个自我独立的类,直接从Object类派生而来。与其他两个继承层次结构没有任何关系。可以实现在一个文件内向前,向后移动。

注意:

  • 本篇博客是一篇读书笔记,具体内容请参看《Thinking in Java》第18章 Java I/O系统
  • 本篇文章只讲述了Java I/O系统的设计框架,关于具体类的用法请参看其他博客。
时间: 2024-11-05 18:32:21

Java基础之I/O详解(二)类库设计模式的相关文章

Java基础之hashCode方法详解

想要明白hashCode的作用,必须要先知道java中的集合.(不明白的请看Java基础之集合框架详解(二)List篇和Java基础之集合框架详解(三)Set篇) Java中的Collection集合有两类,一类是List,另一类是Set,前者集合内的元素是有序的,元素可以重复:后者元素无序且元素不可重复.而我们通常使用Object.equals方法来判断两个元素是否重复.即当我们想查找一个元素中是否包含某个对象时,就是逐一取出每个元素与要找的元素进行比较,当发现某个元素与要查找的对象进行equ

java基础之HTTP协议详解

关于本文,是听了某个老师的课程之后倍感自己对HTTP了解不够深入,因此决定写此博文. 首先,可以参考此文:http://blog.csdn.net/gueter/article/details/1524447 第一部分:浏览器与服务器通信过程: 第二部分:HTTP请求介绍: 第三部分:HTTP协议响应 java基础之HTTP协议详解

JAVA基础汇总及例题详解

java语言的一个核心: jdk, java development kits---面向开发人员 jre, java Runtime Environment---服务器上 java虚拟机---(以字节码为指令的CPU)---*.class java编译器-->字节码-->类加载器进行验证-->虚拟机运行 垃圾回收机制 public class ...{ int a = 1; } c/c++垃圾回收由程序员去运行 java编程语言(一门纯面向对象)的特点: 1, 面向对象  封装  继承

Java基础(55):Exception类详解(转)

Java中的异常 Exception java.lang.Exception类是Java中所有异常的直接或间接父类.即Exception类是所有异常的根类. 比如程序: 1 public class ExceptionTest 2 { 3 public static void main(String[] args) 4 { 5 int a = 3; 6 int b = 0; 7 int c = a / b; 8 System.out.println(c); 9 } 10 } 编译通过,执行时结果

Java基础(44):ArrayList使用详解

1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处:    a.动态的增加和减少元素    b.实现了ICollection和IList接口    c.灵活的设置数组的大小 2.如何使用ArrayList 最简单的例子: ArrayList List = new ArrayList(); for( int i=0;i <10;i++ ) //给数组增加10个Int元素 List.Add(i); //..程序做一

Java基础之开关语句详解

switch 语句是单条件多分支的开关语句,它的一般格式定义如下(其中break语句是可选的): switch(表达式) { case 常量值: 若干个语句 break; case  常量值: 若干个语句 break; ... case  常量值n: 若干个语句 break; default: 若干语句 } switch语句中的"表达式"和"常量值"的值必须为byte.short.int.char型或者枚举类型,而且互不相同. import java.util.Sc

Java基础之集合框架详解(三)Set篇

相关定义 作为Collection接口的重要子接口,Set接口是一个不包含重复元素,且元素排列无序的集合,也被称为集. 注意:不包含重复元素的含义,更确切的讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素. Set接口的方法和Collection接口的方法大体相同,也就是说Set接口不像List接口那样可以通过索引或去元素,只能通过Iterator()方法获取迭代器进行迭代. Set中的add方法不同于Collection接口,有一个

Java基础之集合框架详解(一)

集合框架的相关定义 集合:即存储对象的容器. 框架:即类库的集合. 集合框架:即用来表示和操作集合的统一框架,由相关的接口.实现类和一些帮助程序员完成编程的算法. 集合的作用: 在类的内部,对数据进行组织 简单而快速的搜索大数量的条目 有的集合接口,提供了一系列排列有序的元素,并且可以在序列中间快速的插入或者删除有关元素 有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型 集合与数组的区别: 集合长度是可变的,数组长度是固定不变的 集合中

Java基础与案例开发详解の常用类的介绍

String类 String类的常用构造方法 String s1 = new String(); String s2 = new String("hello"); String s3 = new String(char tmp[]); String s4 = new String(char[] value,int offset,int count) 除了以上方法构造String对象之外,Java编译器会自动为每一个字符串常量生成一个String 类的实例,因此字符串常量String有一