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- |
|
FileOutputStream |
用于将信息写至文件 |
字符串、File、File- |
指定数据的目的地:将其与FilterOutput- |
|
PipedOutputStream |
任何写入其中的信息都会自动作为相关PipedInputStream的输出,实现管道化概念 |
PipedInputStream |
指定用于多线程的数据的目的地:将其与 |
|
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)
本文深入探讨Java中I/O流的基本概念与使用方法,包括File类、输入输出流、装饰器模式等,并介绍了标准I/O及其重定向的实现。

被折叠的 条评论
为什么被折叠?



