第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)
- 第18章 JAVA I/O系统
- 第18章、java I/O系统
- 《Java编程思想》第18章 Java I/O系统
- java编程思想-第18章-java I/O系统
- 第12章 Java I/O系统
- Thinking in Java 第12章 Java I/O系统
- Thinking in Java 第18章 Java I/O 系统(18.1-18.8)
- Thinking in Java 第18章 Java I/O 系统(18.9-18.14)
- think in java第18章Java i/o系统课后习题
- 第10章 系统级I/O
- Java I/O系统
- java I/O系统
- Java I/O系统
- Java I/O系统
- Java I/O系统
- java I/O系统
- Java I/O系统
- Java I/O系统
- IntelliJ IDEA 配置 .ideavimrc
- PGBouncer介绍及使用方式
- shell中test命令及判断符号[ ]的用法统计
- 12.27学习
- listview的上滑下滑监听,上下滑监听隐藏顶部选项栏
- 第18章 JAVA I/O系统
- openwrt之wrtnode学习日记day5
- begin
- Lifecycle Sorter插件
- codeforce 659B
- 如何禁止svg图的放大缩小功能
- eclipse常用插件地址(不断更新)
- hadoop系列:zookeeper(2)——zookeeper核心原理(选举)
- 算法 0-1背包问题