第一章 流和文件
文件是用来保存计算机的数据 。 而文件处理是任何一种编程语言所
必备的一项重要功能, 只有具备这一功能才可以支持处理大量持久性数据的商业应用程序 。 本章将讲述 Java强大的文件处理功能和流
输入 /输出功能 。 文件处理只是 Java流处理功能的子集 。 通过本章的
学习您将达到如下的目标,
? 理解数据流的概念
? 理解 Java流的层次结构
? 掌握字节流的基本使用方法 (InputStream,OutputStream及其子类 )
? 掌握字符流的基本使用方法 (Reader,Writer及其子类 )
? 理解文件的概念
? 能够使用 File类
? 能够创建, 读写, 更新文件
§ 1.1 字节流与字符流
内容提要,
在 Java中, 把所有的输入和输出都当做流来处理 。, 流, 是一个抽象概
念, 它代表任何有能力产出数据的数据源对象或者是有能力接收数据的
接收端对象 。 Java提供了强大的流处理功能 。 本节讲述了 Java中的基本
输入 /输出流及其常用的子类, 主要内容如下,
? 数据流的概念
? 流的层次结构
? 标准流
? 常用字节流
? 常用字符流
1.1.1数据流的概念
在 Java中,把所有的输入和输出都当做流来处理。, 流, 是一个抽象概念,它
代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。
,流, 屏蔽了实际的输入 /输出设备中处理数据的细节。一个程序可以打开一个
数据源上的流,然后按顺序读取这个流中的数据到程序中,这样的流称为输入
流,其过程如图所示。一个程序也可以打开一个目的地的流,然后按顺序的把
程序中的数据写入到这个目的地中,这样的流称为输出流,其过程如图所示。
1.1.2流的分类
Java的输入 /输出流中, 根据它们的数据类型, 主要可分为两
类:字符流 (Character Stream)和字节流 (Btye Stream)。
1,字符流
字符流的输入 /输出数据是字符码, 即 Unicode字符 。 字符流
有两个基本类,Reader类和 Writer类 。 Reader类用于处理字
符输入流, Writer类用于处理字符输出流 。
2,字节流
字节流是按字节读 /写二进制数据。字节流有两个基本的类:
InputStream类和 OutputStream类。 InputStream类用于处理
字节输入流,OutputStream类用于处理字节输出流。
1.1.3 标准流
在 Java程序开始执行时, Java会创建三个与设备相
关联的流对象,System.in,System.out和 System.err。
System.in(标准输入流 )对象使程序能够读取来自键
盘的输入; System.out (标准输出流 )对象使程序能够
向屏幕输出数据; System.err (标准错误流 )对象使程
序能够向屏幕输出错误信息 。 每种标准流都可以被
重定向 。 对 System.in进行重定向, 程序能够从其它
数据源读取数据;对 System.out和 System.err进行重
新定向, 使程序能够将输出数据和错误信息发送到
其它的位置, 比如磁盘上的某个文件 。
1.1.3 标准流
示例 1.1.1 编写一段代码实现如下功能:从标准输入流
(键盘 )输入一串字符, 然后输出到标准输出流 (屏幕 )
中 。
1.1.4 字节流
字节流是按字节读写数据, 它有两个基本类,InputStream和 OutputStream。
InputStream类作为字节输入流, OutputStream作为字节输出流, 它们都是抽象
类, 本身不能直接用来创建对象 。 InputStream类和 OutputStream类为其它字节
输入 /输出流子类提供了一些基本方法和标准接口 。
InputStream类提供的常用方法有,
void close()
int read(type[] b)
int read(byte[] b,int off,int len)
int available( )
long skip(long n)
void mark( int readlimit )
void reset( )
abstract int read()
1.1.4 字节流
OutputStream类提供的常用方法有,
void write( byte b[ ] )
void write( byte b[ ],int off,int len )
void flush( )
void close( )
1.1.4 字节流
抽象类 InputStream和 OutputStream有很多子类, 这些不同的子类实现了
各种不同功能的输入 /输出字节流 。 InputStream和 OutputStream的类层次
关系如下图所示 。
1.1.4.1 字节文件流
1,文件类
Java中的 File类主要用于获取磁盘中文件或目录的信息 。 File类的对象并不打开文
件, 也不提供任何文件处理功能 。 然而, java.io包中的其它类经常使用 File对象
来指定要操作的文件或目录 。 File类提供的常用方法有,
File(String name)
File(String parent,String child)
File(URI uri)
boolean canRead()
boolean canWrite()
boolean isFile()
boolean isDirectory()
boolean exists()
1.1.4.1 字节文件流
2,文件字节输入流
FileInputStream(文件字节输入流 )主要用于文件的输入, 通过该类创建的对象可以
从文件中读数据 。 FileInputStream类提供的常用方法有,
FileInputStream(String name) throws FileNotFoundException
创建一个关联到实际文件的文件字节输入流, name指定了要关联到的文件的路径
名 。 如果该文件不存在或是不能被打开, 将抛出一个 FileNotFoundException异常 。
FileInputStream(File file) throws FileNotFoundException
创建一个关联到实际文件的文件字节输入流, file是一个文件对象 。 如果该文件
不存在或是不能被打开, 将抛出一个 FileNotFoundException异常
1.1.4.1 字节文件流
示例 1.1.2 编写一段代码实现如下功能:从指定文件中读出所有
数据, 然后输出到标准输出流 (屏幕 )中 。
1.1.4.1 字节文件流
3,文件字节输出流
FileOutputStream(文件字节输出流 )主要用于文件的输出, 通过该类创建的对象可
以往文件中写数据 。 FileOutputStream类提供的常用方法有,
FileOutputStream (String name) throws FileNotFoundException
FileOutputStream (File file) throws FileNotFoundException
FileOutputStream (String name,boolean append) throws FileNotFoundException
FileOutputStream (File file,boolean append) throws FileNotFoundException
1.1.4.1 字节文件流
示例 1.1.3 编写一段代码实现如下功能:从标准输入 (键盘 )接收
一串字符, 然后, 写入到指定的文件中 。
1.1.4.2字节过滤流
1,缓冲字节输入流和缓冲字节输出流
为了提高输入 /输出处理的效率, 应尽可能的使用缓冲流将输入 /输出数
据放入到内部缓冲数组中处理 。 当一个 BufferedInputStream对象被创建
时, 就产生了一个内部缓冲数组, 因此, 可以根据需要从连接的输入数
据流中一次性读多个字节的数据到内部缓冲数组中;同样, 当一个
BufferedOutputStream对象被创建时, 也会产生一个内部缓冲数组, 可以
从连接的输出数据流中一次性向内部缓冲数组中写多个字节的数据 。
BufferedInputStream类提供的常用方法有,
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in,int size)
BufferedOutputStream类提供的常用方法有,
BufferedOutputStream (OutputStream out)
BufferedOutputStream (OutputStream out,int size)
1.1.4.2字节过滤流
示例 1.1.4 编写一段代码实现如下功能:从标准输入 (键盘 )接收
一串字符, 然后, 以缓冲的方式写入到指定的文件中 。
1.1.4.2字节过滤流
2,顺序输入流
顺序输入流 (SequenceInputStream)可以在逻辑上连接一组输入流, 即将
这一组输入流视为一个连续的输入流 。 和其它输入流一样, 顺序输入流
也使用 Read()方法从输入流中读取数据;和其它输入流不一样的是, 顺
序输入流的构造函数有些特别, 它要么使用两个输入流做参数, 要么使
用一组输入流作为参数, 具体形式如下,
SequenceInputStream(InputStream s1,InputStream s2)
SequenceInputStream(Enumeration streamEnum)
1.1.4.2字节过滤流
示例 1.1.5 编写一段代码实现如下功能:将两个文件 (文件 A和文
件 B)中的内容合并, 并写到一个新的文件 (C)中 。
1.1.5 字符流
JDK1.1对基本的 I/O流类库进行了重大的修改 ──添加了字符
流 。 字符流有两个基本类,Reader和 Writer。 Reader类是所
有输入字符流的父类, Writer类是所有输出字符流的父类 。
设计 Reader和 Writer继承层次结构主要是为了国际化 。 而旧
的 I/O流继承层次结构仅支持 8位字节流, 并且不能很好的处
理 16位的 Unicode字符 。 由于 Unicode用于字符国际化, 所以
添加字符流的继承层次结构就是在所有的 I/O操作中都支持
Unicode。
1.1.5 字符流
Reader类提供的常用方法有,
abstract void close()
int read()
int read(char[] cbuf)
abstract int read(char[] cbuf,int off,int len)
long skip(long n)
void mark( int readAheadLimit)
void reset( )
1.1.5 字符流
Writer类提供的常用方法有,
abstract void close()
abstract void flush()
void write( int ch)
void write(char[] cbuf)
abstract void write(char[] cbuf,int off,int len)
void write(String str)
void write(String str,int off,int len)
1.1.5 字符流
字符流的类层次关系如下图所示 。
1.1.5 字符流
几乎所有的字节流类都有相对应的字符流 。 具体对应关系见下表 。 注意,
InputStreamReader类和 OutputStreamWriter类比较特殊, 它们用于在字节流和字
符流之间架起桥梁 。
1.1.5 字符流
1,文件字符流
FileReader用于文件的输入, 该类以字符流的方式从文件中读数据 。
FileReader类提供的常用方法有,
FileReader(String name) throws FileNotFoundException
FileReader (File file) throws FileNotFoundException
FileWriter用于文件的输出, 该类以字符流的方式往文件中写数据 。
FileWriter类提供的常用方法有,
FileWriter (String name) throws FileNotFoundException
FileWriter (String name,boolean append) throws FileNotFoundException
FileWriter (File file,boolean append) throws FileNotFoundException
1.1.5 字符流
2,缓冲字符流
BufferedReader和 BufferedWriter是过滤流, 它们分别能对输入 /输出字符
流提供缓冲功能 。 缓冲字符流提供的方法和缓冲字节流相似, 但构造函
数必须以字符流为输入参数, 如下,
BufferedReader(Reader in)
BufferedReader (Reader in,int size)
BufferedWriter (Writer out)
BufferedWriter (Writer out,int size)
和缓冲字节输入流不同的是, 缓冲字符输入流还提供了新的方法用来读
一行数据, 如下,
String readLine()
1.1.5 字符流
示例 1.1.6 编写一段代码实现如下功能:从文件 A中读出数据,
然后将读出的数据写入到文件 B中, 要求同时满足以下条件:
① 以字符流的形式读出数据, 并且一次读取一行数据; ② 以
缓冲的形式读 /写数据 。
小结
本节主要学习了以下内容,
一, 数据流:, 流, 是一个抽象概念, 它代表任何有能力产出数据的数据源对象或
者是有能力接收数据的接收端对象 。, 流, 屏蔽了实际的输入 /输出设备中处理
数据的细节 。
二, 流的分类,Java的输入 /输出流中, 根据它们的数据类型, 主要可分为两类:字
符流 (Character Stream)和字节流 (Btye Stream)。
三, 标准流:在 Java程序开始执行时, Java会创建三个与设备相关联的流对象:标
准输入流, 标准输出流和标准错误流 。 标准输入流对象使程序能够读取来自键
盘的输入;标准输出流对象使程序能够向屏幕输出数据;标准错误流对象使程
序能够向屏幕输出错误信息 。
四, 字节流:字节流是按字节读写数据, 它有两个基本类,InputStream和
OutputStream。
五, 字符流:字符流的输入 /输出数据是字符码, 即 Unicode字符 。 字符流有两个基
本类,Reader和 Writer。