第18章 JAVA I/O系统

来源:互联网 发布:linux 查看服务器版本 编辑:程序博客网 时间:2024/05/17 02:43

18.1 File类

既能代表一个特定文件的名称,又能代表一个目录

18.2 输入和输出

我们很少使用单一的类来创建流对象而是通过创建多个对象来提供所期望的功能,实际上,JAVA中流类库让你迷惑的主要原因就在于:创建单一的结果流,却需要

创建多个对象;

18.2.1 InputStream类型

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

字节数组、String对象、文件、管道(从一段输入从另一端输出)、一个由其他种类的流组成的序列以便我们可以将它们收集到一个流内、其他数据源(如:网络请求)

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

功能

构造器参数

如何使用

ByteArrayInputStream

允许将内存的缓冲区当做InputStream使用

缓冲区,字节将从中取出

作为一种数据源:将其FilterInputStream

对象相连以提供有用接口

StringBufferInputStream

将String转换成InputStream

字符串,底层实现实际使用StringBuffer

作为一种数据源:将其与FilterInput-

Stream对象相连以提供有用接口

FileInputStream

从文件中读取信息

字符串、File、FileDescriptor对象

作为一种数据源:将其与FilterInput-

Stream对象相连以提供有用接口

PipedInputStream

产生用于写入相关PipedOutputStream的数据,实现“管道化”概念

PipedOutputStream

作为多线程中数据源:将其与FilterInput

Stream对象相连以提供有用接口

SequenceInputStream

将两个或多个Input

Stream对象转换成单一InputStream

两个InputStream对象或一个容纳Input-

Stream对象的容器Enumeration

作为一种数据源:将其与FilterInput-

Stream对象相连以提供有用接口

FilterInputStream

抽象类,作为装饰器的接口,其中装饰器为其他的Input-

Stream类提供有用功能

见下一节

见下一节

18.2.2 OutputStream类型

该类别的类决定了输出所要前往的目标:字节数组、文件、管道;另外,FilterOutputStream为装饰器类提供了一个基类,装饰器类把属性或者有用的接口与输出流连接起来

功能

构造器参数

如何使用

ByteArrayOutputStream

在内存中创建缓冲区,所有送往流的数据都要放置在此缓冲区

缓冲区初始化尺寸(可选的)

用于指定数据的目的地:将其余Filter-
OutputStream对象相连以提供有用接口

FileOutputStream

用于将信息写至文件

字符串、File、File-
Descriptor对象

指定数据的目的地:将其与FilterOutput-
Stream对象相连以提供有用接口

PipedOutputStream

任何写入其中的信息都会自动作为相关PipedInputStream的输出,实现管道化概念

PipedInputStream

指定用于多线程的数据的目的地:将其与
FilterOutputStream对象相连以提供有用接口

FilterOutputStream

抽象类,作为装饰器的接口,其中装饰器为其他OutputStream提供有用功能

下一节

下一节

装饰模式

装饰模式就是给一个对象增加一些新的功能,而且是动态增加,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例;

优点:动态的为一个对象增加新功能,还能动态撤销

缺点:产生过多相似的对象

18.3 添加属性和有用的接口

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

但是,装饰器模式也有一个缺点:在编程的时候,它给我们提供了相当多的灵活性,但同时也增加了代码的复杂性,JAVA I/O类库操作不方便的原因在于:我们必须创建许多类---“核心”I/O类型加上所有的装饰器才能得到我们所希望的单个I/O对象

(这里我真想能列举出每个I/O对应的装饰类的类名,当然前提是它有的话)

FilterInputStream和FilterOutputStream是用来提供装饰器类接口来控制特定InputStream和OutputStream的两个类,FilterInputStream和FilterOutputStream分别从InputStream和OutputStream派生而来,这两个类是装饰器的必要条件

18.3.1 通过FilterInputStream从InputStream读取数据

FilterInputStream子类列表:

功能

构造器参数

如何使用

DataInputStream

与DataOutputStream搭配使用,因此我们可以按照可移植方式从流中读取基本类型

InputStrea

包含用于读取基本类型数据的全部接口

BufferedInputStream

使用它可以防止每次读取时都要进行实际写操作,代表“使用缓冲区”

InputStream、可以指定缓冲区大小(可选)

本质上不提供接口,只不过是向进程中添加缓冲区所必须的,与接口对象搭配

LineNumberInputStream

跟踪输入流中的行号,可调用getLineNumber和setLineNumber(int)

InputStream

仅仅增加了行号,因此可能要与接口对象搭配使用

PushbackInputStream

具有“能弹出一个字节的缓冲区”,因此可以将读到的最后一个字符回退

InputStream

通常作为编译器的扫描器,之所以包含在内是因为JAVA编译器的需要,我们可能永远用不到

18.3.2 通过FilterOutputStream向OutputStream写入

1、与DataInputStream对应的DataOutputStream,它可以将各种基本数据类型以及String对象格式化输出到流中,这样以来,任何机器上的任何DataInputStream都能够读取它们,所有方法都是wirte开头;

2、PrintStream最初的目的便是为了以可视化格式打印所有的基本数据类型以及String对象,这和DataOutputStream不同,DataOutputStream是将数据元素写入流中,PrintStream包含2个重要方法:print、println;PrintStream捕捉了所有的IOExecption,因此我们必须使用checkError来让开发者检查错误状态,如果出现错误该方法则返回true,还有PrintStream尚未完全国际化,不能以平台无关的方式来处理换行动作

FilterOutputStream子类列表

功能

构造器参数

如何使用

DataOutputStream

与DataInputStream搭配使用,因此可以按照可移植方式向流中写入基本类型数据

OutputStream

包含用于写入基本类型数据的全部接口

PrintStream

用于产生格式化输出

OutputStream

可是用boolean来决定是否在每次换行时清空缓存区,应该是对OutputStream兑现个final封装

BufferedOutputStream

使用它可以避免每次发送数据时都要进行实际的写操作,代表“使用缓冲区”,可以调用flush清空缓冲区

OutputStream,可以指定缓冲区大小(可选)

本质上并不提供接口,只不过是向进程中添加缓冲区所必须的,与接口对象搭配

18.4 Reader和Writer

InputStream和OutputStream在以面向字节形式的I/0中仍可以提供极有价值的功能,Reader和Writer则提供了兼容Unicode与面向字符的I/0功能

InputStreamReader可以把InputStream转换为Reader,而OutputStreamWriter可以把OutputStream转换为Writer

18.4.1 数据的来源和去处

来源与去处 JAVA1.0

相应的JAVA1.1类

InputStream

Reader,适配器InputStreamReader

OutputStream

Writer,适配器OutputStreamWriter

FileInputStream

FileReader

FileOutputStream

FileWriter

StringBufferInputStream,已弃用

StringReader

 

StringWriter

ByteArrayInputStream

CharArrayReader

ByteArrayOutputStream

CharArrayWriter

PipedInputStream

PipedReader

PipedOutputStream

PipedWriter

18.4.2 更改流的行为

过滤器:JAVA1.0类

相应的JAVA1.1类

FilterInputStream

FilterReader

FilterOutputStream

FilterWriter,抽象类,没有子类

BufferedInputStream

BufferedReader

BufferedOutputStream

BufferedWriter

DataInputStream

使用DataInputStream

PrintStream

PrintWriter

LineNumberInputStream,已弃用

LineNumberReader

StreamTokenizer

StreamTokentzer

PushbackInputStream

PushbackReader

 

18.6 I/O流的典型使用方式

18.6.1 缓冲输入文件

BufferedReader in = new BufferedReader(newFile(“XXXX.txt”));

String s;

While((s = in.readLine()) != null){

         System.out.println(s);

}

18.6.2 从内存输入

StringReader in = new StringReader(BufferedInputFile.read(“XXX.java”));

Int c;

While((c = in.read()) !=  -1){

         System.out.print((char)c);

}

18.8 标准I/O

标准I/O的意义在于:我们可以很容易地把程序串联起来,一个程序的标准输出可以成为另一个程序的标准输入;

18.8.1 从标准输入中读取

System.out/System.err被包装成了PrintStream对象,而System.in却是一个没有被包装过的未经加工的InputStream,

BufferedReader reader = new BufferedReader(newInputStreamReader(System.in));

String s;

While((s = reader.readLine() != null)&& s.length() != 0){

         System.out.print(s);

}

18.8.2 将System.out转换成PrintWriter

PrintWriter out = new printWriter(System.out,true);

18.8.3 标准I/O重定向

setIn(InputStream)/setOut(PrintStream)/setErr(PrintStream)

 

 

0 0
原创粉丝点击