第 7章 Java的输入 /输出
2012-3-7 Java面向对象程序设计教程 2
主要内容
? 7.1 流输入 /输出类的层次结构
? 7.1.1 流的概念
? 7.1.2 字节流
? 7.1.3 字符流
? 7.1.4 转换流
? 7.1.5 输入输出类的分类
? 7.1.6 标准流
? 7.1.7 IOException及其子类
? 7.2 输入 /输出流类的应用
? 7.2.1 输入 /输出流类的一般例子
? 7.2.2 典型的输入 /输出流类的组合应用
? 7.2.3 对象串行化
? 7.3 文件类的应用
? 7.3.1 File类
? 7.3.2 File类应用举例
7.1 流输入 /输出类的层次结构
2012-3-7 Java面向对象程序设计教程 4
流的概念
? 流( Stream)是有序的数据序列,它有源(输入流)与
目的(输出流)。
? java.io包使用术语流定义 I/O(输入 /输出)。该包有两
个主要的部分:字符流( Character stream)和字节流
( Byte stream)。
? 基于文本的 I/O都是一些人们能够阅读的字符(比如说程
序的源代码),而基于数据的 I/O是二进制(比如说表示
图像的位图)。
? 字节流被称作输入流( Input stream)或输出流
( Output stream),而字符流被称作 Reader或 Writer。
? 字节流不能正确携带字符,一些与字符相关的流在字节流
里是没有意义的 。
2012-3-7 Java面向对象程序设计教程 5
java.io包里的类和接口分类
? 普通的用于建立不同字节和字符流类型的类 ——
输入输出流,Reader,Writer和在它们之间进行
转换的类。
? 定义不同类型流的范围 —— 过滤流、缓冲流、管
道流以及一些流的具体实例。
? 读写基本值和字符串数据流的类和接口。
? 一个以系统无关的方式与文件进行交互的类和接
口。
? 形成对象串行化( Object serialization)机制的
类和接口 —— 将对象传递到字节流,或从一个字
节流中读取数据,重新组建对象。
2012-3-7 Java面向对象程序设计教程 6
java.io包里的字节流
2012-3-7 Java面向对象程序设计教程 7
InputStream及其子类的推荐用法
? 当需要输入 ASCII正文或者二进制数值时,应当
使用 InputStream类。
? 根据输入源,选用 FileInputStream或某个
getInputStream方法。
? 可以有选择行地使用任意数量的 InputStream过
滤器、缓冲区、扩展器、编码器等子类,然后再
上层包装 DataInputStream类,并使用它的
read方法执行输入。如果需要读入对象而非普通
数据,则应当使用 ObjectInputStream类。
? 如果需要使用缓冲技术,应当直接包装
FileInputStream类,以便尽可能早地让所有的
类都采用缓冲技术。
2012-3-7 Java面向对象程序设计教程 8
java.io的字符流
2012-3-7 Java面向对象程序设计教程 9
转换流
? 转换流使用的类 InputStreamReader和
OutputStreamReader实现了 Unicode相同指
定编码的字节流,或者本机系统的默认编码的字
节流之间的转换。
2012-3-7 Java面向对象程序设计教程 10
输入输出类的分类
? 文件 I/O, FileInputStream
? 内存缓冲区 I/O, BufferedInputStream
? 存取 I/O, DataInputStream
? 管道 I/O, PipedInputStream
? 过滤器 I/O, FilterInputStream
2012-3-7 Java面向对象程序设计教程 11
标准流
? System.out是标准的输出流,默认情况下,
它是一个控制台。
? System.in是标准输入流,默认情况下,
它指的是键盘。
? System.err指的是标准错误流,它默认是
控制台。
? 这些流可以重定向到任何兼容的输入 /输出
设备。
2012-3-7 Java面向对象程序设计教程 12
IOException及其子类
? 在 java.io中,每一个特定的 I/O错误都是
用异常 IOException及其子类来报告的。
? 最常见的 I/O异常有
FileNotFoundException、
EOFException、
InterruptedIOException、
UTFDataFormatError等。
7.2 输入 /输出流类的应用
2012-3-7 Java面向对象程序设计教程 14
输入 /输出流类的一般例子
? 在使用输入输出流类时,有两个语句总是
要注意的,
? 一是导入 java.io包( import java.io.*;);
? 二是对 IOException异常的处理,一般是在调
用的方法的声明时, throws IOException”,
当然也可以用 try-catch语句进行异常处理。
? 直接读取标准输入流的用法,
InputStreamDemo.java
? 管道流的使用,PipeIODemo.java
2012-3-7 Java面向对象程序设计教程 15
典型的输入 /输出流类的组合应用
? 标准输入输出,
StandardIODemo.java
? 读写顺序文件,FileIODemo.java
? 读写二进制文件,BinaryIODemo.java
? 读写随机文件,RandomIODemo.java
2012-3-7 Java面向对象程序设计教程 16
RandomAccessFile类的文件访问控制权限
? "r" 只读,如果试图进行写操作将引发异常
IOException。
? "rw" 可读可写,如果文件不存在将会先创
建该文件。
? "rws" 文件可读可写,并且要求每次更改
文件内容或元数据时同步写到存储设备中。
? "rwd" 文件可读可写,并且要求每次更改
文件内容时同步写到存储设备中。
2012-3-7 Java面向对象程序设计教程 17
对象串行化
? 把一个对象的表示转化为字节流的过程称为串行
化( Serialization),而从字节流中把对象重建
出来即是反串行化( Deserialization)。
? 关键字 transient描述的是临时的变量,它为被串
行化的数据提供了一个语言级的标记数据方法。
? 默认的串行化过程是将既不是 transient也不是
static的对象的每个域变量串行化。基本类型和
字符串是用 DataOutputStream中的编码写的,
对象被 ObjectOutputStream的 writeObject方
法串行化。
2012-3-7 Java面向对象程序设计教程 18
思考与练习
? 在 ObjectSerialization.java 文件中改变
变量前面的关键字( 增删 transient或
static ),观察输出结果及文件 data.ser
大小的变化。
? 在 ObjectSerialization.java 文件中,如
果使 readObject和 writeObject中定义的
结构顺序不一致,将导致什么结果?
7.3 文件类的应用
2012-3-7 Java面向对象程序设计教程 20
文件类的应用
? File类提供了好几种操作文件名的有用操作。
它提供了将路径名分解的方法,用于查询
路径名所指文件有关的文件系统。
? 一个 File对象实际上表示一条路径,不必是
一个底层文件。
2012-3-7 Java面向对象程序设计教程 21
举例
? 查询文件信息,FileInfo.java
? 复制文件,Copy.java
? 查询某个目录下子目录及文件,Dir.java
2012-3-7 Java面向对象程序设计教程 2
主要内容
? 7.1 流输入 /输出类的层次结构
? 7.1.1 流的概念
? 7.1.2 字节流
? 7.1.3 字符流
? 7.1.4 转换流
? 7.1.5 输入输出类的分类
? 7.1.6 标准流
? 7.1.7 IOException及其子类
? 7.2 输入 /输出流类的应用
? 7.2.1 输入 /输出流类的一般例子
? 7.2.2 典型的输入 /输出流类的组合应用
? 7.2.3 对象串行化
? 7.3 文件类的应用
? 7.3.1 File类
? 7.3.2 File类应用举例
7.1 流输入 /输出类的层次结构
2012-3-7 Java面向对象程序设计教程 4
流的概念
? 流( Stream)是有序的数据序列,它有源(输入流)与
目的(输出流)。
? java.io包使用术语流定义 I/O(输入 /输出)。该包有两
个主要的部分:字符流( Character stream)和字节流
( Byte stream)。
? 基于文本的 I/O都是一些人们能够阅读的字符(比如说程
序的源代码),而基于数据的 I/O是二进制(比如说表示
图像的位图)。
? 字节流被称作输入流( Input stream)或输出流
( Output stream),而字符流被称作 Reader或 Writer。
? 字节流不能正确携带字符,一些与字符相关的流在字节流
里是没有意义的 。
2012-3-7 Java面向对象程序设计教程 5
java.io包里的类和接口分类
? 普通的用于建立不同字节和字符流类型的类 ——
输入输出流,Reader,Writer和在它们之间进行
转换的类。
? 定义不同类型流的范围 —— 过滤流、缓冲流、管
道流以及一些流的具体实例。
? 读写基本值和字符串数据流的类和接口。
? 一个以系统无关的方式与文件进行交互的类和接
口。
? 形成对象串行化( Object serialization)机制的
类和接口 —— 将对象传递到字节流,或从一个字
节流中读取数据,重新组建对象。
2012-3-7 Java面向对象程序设计教程 6
java.io包里的字节流
2012-3-7 Java面向对象程序设计教程 7
InputStream及其子类的推荐用法
? 当需要输入 ASCII正文或者二进制数值时,应当
使用 InputStream类。
? 根据输入源,选用 FileInputStream或某个
getInputStream方法。
? 可以有选择行地使用任意数量的 InputStream过
滤器、缓冲区、扩展器、编码器等子类,然后再
上层包装 DataInputStream类,并使用它的
read方法执行输入。如果需要读入对象而非普通
数据,则应当使用 ObjectInputStream类。
? 如果需要使用缓冲技术,应当直接包装
FileInputStream类,以便尽可能早地让所有的
类都采用缓冲技术。
2012-3-7 Java面向对象程序设计教程 8
java.io的字符流
2012-3-7 Java面向对象程序设计教程 9
转换流
? 转换流使用的类 InputStreamReader和
OutputStreamReader实现了 Unicode相同指
定编码的字节流,或者本机系统的默认编码的字
节流之间的转换。
2012-3-7 Java面向对象程序设计教程 10
输入输出类的分类
? 文件 I/O, FileInputStream
? 内存缓冲区 I/O, BufferedInputStream
? 存取 I/O, DataInputStream
? 管道 I/O, PipedInputStream
? 过滤器 I/O, FilterInputStream
2012-3-7 Java面向对象程序设计教程 11
标准流
? System.out是标准的输出流,默认情况下,
它是一个控制台。
? System.in是标准输入流,默认情况下,
它指的是键盘。
? System.err指的是标准错误流,它默认是
控制台。
? 这些流可以重定向到任何兼容的输入 /输出
设备。
2012-3-7 Java面向对象程序设计教程 12
IOException及其子类
? 在 java.io中,每一个特定的 I/O错误都是
用异常 IOException及其子类来报告的。
? 最常见的 I/O异常有
FileNotFoundException、
EOFException、
InterruptedIOException、
UTFDataFormatError等。
7.2 输入 /输出流类的应用
2012-3-7 Java面向对象程序设计教程 14
输入 /输出流类的一般例子
? 在使用输入输出流类时,有两个语句总是
要注意的,
? 一是导入 java.io包( import java.io.*;);
? 二是对 IOException异常的处理,一般是在调
用的方法的声明时, throws IOException”,
当然也可以用 try-catch语句进行异常处理。
? 直接读取标准输入流的用法,
InputStreamDemo.java
? 管道流的使用,PipeIODemo.java
2012-3-7 Java面向对象程序设计教程 15
典型的输入 /输出流类的组合应用
? 标准输入输出,
StandardIODemo.java
? 读写顺序文件,FileIODemo.java
? 读写二进制文件,BinaryIODemo.java
? 读写随机文件,RandomIODemo.java
2012-3-7 Java面向对象程序设计教程 16
RandomAccessFile类的文件访问控制权限
? "r" 只读,如果试图进行写操作将引发异常
IOException。
? "rw" 可读可写,如果文件不存在将会先创
建该文件。
? "rws" 文件可读可写,并且要求每次更改
文件内容或元数据时同步写到存储设备中。
? "rwd" 文件可读可写,并且要求每次更改
文件内容时同步写到存储设备中。
2012-3-7 Java面向对象程序设计教程 17
对象串行化
? 把一个对象的表示转化为字节流的过程称为串行
化( Serialization),而从字节流中把对象重建
出来即是反串行化( Deserialization)。
? 关键字 transient描述的是临时的变量,它为被串
行化的数据提供了一个语言级的标记数据方法。
? 默认的串行化过程是将既不是 transient也不是
static的对象的每个域变量串行化。基本类型和
字符串是用 DataOutputStream中的编码写的,
对象被 ObjectOutputStream的 writeObject方
法串行化。
2012-3-7 Java面向对象程序设计教程 18
思考与练习
? 在 ObjectSerialization.java 文件中改变
变量前面的关键字( 增删 transient或
static ),观察输出结果及文件 data.ser
大小的变化。
? 在 ObjectSerialization.java 文件中,如
果使 readObject和 writeObject中定义的
结构顺序不一致,将导致什么结果?
7.3 文件类的应用
2012-3-7 Java面向对象程序设计教程 20
文件类的应用
? File类提供了好几种操作文件名的有用操作。
它提供了将路径名分解的方法,用于查询
路径名所指文件有关的文件系统。
? 一个 File对象实际上表示一条路径,不必是
一个底层文件。
2012-3-7 Java面向对象程序设计教程 21
举例
? 查询文件信息,FileInfo.java
? 复制文件,Copy.java
? 查询某个目录下子目录及文件,Dir.java