java数据流操作
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第11章 Java数据流 章 数据流
[内容提要 内容提要] 内容提要 大部分程序都需要数据的输入和输出, 大部分程序都需要数据的输入和输出, 从键盘读取数据, 从键盘读取数据, 向文件写入数据或从文件获取数据, 向文件写入数据或从文件获取数据, 将数据通过打印机打印出来, 将数据通过打印机打印出来, 通过网络进行信息交换
事实上, 事实上,我们经常使用的是 派生自他们的子类。 派生自他们的子类。 java.io包的结构如图 包的结构如图11-1: 包的结构如图 :
三、 标准输入输出 类中有三个静态域System.in、 在System类中有三个静态域 类中有三个静态域 、 System.out和System.err。 和 。 可以在标准位置使用这三个系统流进行I/O操作 操作。 可以在标准位置使用这三个系统流进行 操作。 public static InputStream in 读取字符数据的标准输入流。 读取字符数据的标准输入流。 public static PrintStream out 显示或打印输出信息的标准输出流 public static PrintStream err 输出错误信息的标准错误流。 输出错误信息的标准错误流。
(二)、InputStream )、
InputStream为所有的字节输入流的父类,因此 为所有的字节输入流的父类, 为所有的字节输入流的父类 所有源于它的类也会继承下列的方法: 所有源于它的类也会继承下列的方法: int read():读入一个字节的数据,如果已达到文 读入一个字节的数据, 读入一个字节的数据 件的末端,返回值为 返回值为-1。 件的末端 返回值为 。 int read(byte[] buffer):读出 读出buffer大小的数据, 大小的数据, 读出 大小的数据 返回值为实际所读出的字节。 返回值为实际所读出的字节。 int read(byte[] buffer,int offset,int len):将读出的 将读出的 数据从buffer[offset]开始,写入 个字节至 开始, 数据从 开始 写入len个字节至 buffer中,返回值为实际所读出的字节数目。 中 返回值为实际所读出的字节数目。 int available(): 返回流内可供读取的字节数目。 返回流内可供读取的字节数目。 long skip(long n): 跳过 个字节的数据,返回值 跳过n个字节的数据 个字节的数据, 为实际所跳过的数据数。 为实际所跳过的数据数。 void close(): 关闭流。 关闭流。
(三)、FileInputStream和FileOutputStream )、 和 FileInputStream用来读取一个文件 用来读取一个文件,FileOutPutStream用 用来读取一个文件 用 来将数据写入文件。 来将数据写入文件。 常用的构造函数如下: 常用的构造函数如下: FileInputStream(String name): 打开文件 打开文件name用来读取 用来读取 数据。 数据。 FileInputStream(File file): 打开文件 用来读取数据。 打开文件file用来读取数据 用来读取数据。 FileOutputStream(String name): 打开文件 打开文件name用来写入 用来写入 数据。 数据。 FileOutputStream(File file): 打开文件 用来写入数据。 打开文件file用来写入数据 用来写入数据。 FileOutputStream(String name,Boolean append): 打开文 用来写入数据, 件name用来写入数据,若append为true,则写入的数据 用来写入数据 为 则写入的数据 会加到原有文件后面,否则,覆盖原有的文件。 会加到原有文件后面,否则,覆盖原有的文件。
InputStream FileInputStream
输入流 输出流的类继承关系
OutputStream FileOutputStream ByteArrayOutputStream PipedOutputStream FilterOutputStream BufferedOutputStream PrintStream DataOutputStream
例11-1:标准输入输出举例 :
程序运行如下: 程序运行如下: 输入: 输出: 输入:a,b,c,d 输出:a,b,c,d 输入: 输入复合键CTRL-Z) 输入:^Z (注:输入复合键 )
输出: 输出: program end
第2节 文件的顺序访问 节
一、 字节流 字节流是用来读写8位的数据 位的数据, 字节流是用来读写 位的数据,由于不会对数据 作任何转换,因此可以用来处理二进制的数据。 作任何转换,因此可以用来处理二进制的数据。
常用的构造函数如下: 常用的构造函数如下:
ByteArrayInputStream(byte[] buffer): 生成一个字节数组的 输入流,并指定一个字节数组buffer为此输入流的流缓冲区。 为此输入流的流缓冲区。 输入流,并指定一个字节数组 为此输入流的流缓冲区 ByteArrayOutputStream(): 生成一个字节数组的输出流,其 生成一个字节数组的输出流, 缓冲区的默认初始大小为32字节 若有需要, 字节, 缓冲区的默认初始大小为 字节,若有需要,缓冲区的大小 会随之增加。 会随之增加。 ByteArrayOutputStream(int size): 同上,但分配 同上,但分配size字节的初 字节的初 始大小给此缓冲区。 始大小给此缓冲区。 ByteArrayOutputStream的一些常用方法: 的一些常用方法: 的一些常用方法 int size() : 返回此流缓冲区的大小。 返回此流缓冲区的大小。 byte[] toByteArray() : 生成一个新的字节数组,并将流的内 生成一个新的字节数组, 容复制到此字节数组。 容复制到此字节数组。 String toString() : 将流的内容转换为 将流的内容转换为String对象。 对象。 对象 下面程序读入文件data.in,将其内容写入内存中(一个字节数 将其内容写入内存中( 下面程序读入文件 将其内容写入内存中 ),接着转换为 接着转换为String对象,并将该 对象, 组),接着转换为 对象 并将该String对象内的令牌 对象内的令牌 解析出来。 解析出来。
(一)、OutputStream )、 )、InputStream (二)、 )、FileInputStream和FileOutputStream (三)、 和 )、ByteArrayInputStream和ByteArrayOutputStream (四)、 和 )、BufferedInputStream和BufferedOutputStream (五)、 和
本章介绍Java标准程序库中各种处理 标准程序库中各种处理I/O 操作的类 本章介绍 标准程序库中各种处理 的用途及使用方法。 的用途及使用方法。
第1节 输入 输出概念 节 输入/输出概念
一、 流的概述 Java使用流 使用流(stream)来执行输入输出 来执行输入输出(I/O) 使用流 来执行输入输出 的功能, 的功能,流是一种数据的源头和目的之 间的通信途径。 间的通信途径。 用于读入数据称为输入流(input stream), 用于读入数据称为输入流 , 用于写出数据称为输出流(output stream)。 用于写出数据称为输出流 。
复制为FileExam.ja来自百度文库a.bak。 将FileExam.java复制为 复制为 。
1) 程序首先打开 程序首先打开FileExam.java文件, 文件, 文件 2) 使用read()将其内容逐字节读取出来(如果 将其内容逐字节读取出来( 使用 将其内容逐字节读取出来 返回值为-1,则表明已到达文件尾端), 返回值为 ,则表明已到达文件尾端), 3) 再使用write()将读出的字节逐一写入另一个 再使用 将读出的字节逐一写入另一个 文件FileExam.java.bak中。 文件 中 4) 若文件无法打开(例如FileExam.java不存在) 若文件无法打开(例如FileExam.java不存在 不存在) 或无法生成( ),会抛出 或无法生成(FileExam.java.bak),会抛出 ), FileNotFoundException异常,若读写出错, 异常, 异常 若读写出错, 则会抛出IOException异常。 异常。 则会抛出 异常 5) 最后,我们在 最后,我们在finally中关闭文件。 中关闭文件。 中关闭文件
StringBufferInputStream ByteArrayInputStream SequenceInputStream PipedInputStream FilterInputStream BufferedInputStream
LineNumberInputStream DataInputStream PushbackInputStream
例11-2 FileIO.java
(四)、ByteArrayInputStream和 )、 和 ByteArrayOutputStream
1) 使用这两个流类可以将数据转换到一个数据类型为字 节类型的数组(byte array)中, 节类型的数组( ) 2) ByteArrayInputStream和ByteArrayOutputStream并 和 并 没有牵涉到真正的文件,他们使用内存( 没有牵涉到真正的文件,他们使用内存(一个流缓冲 作为I/O流的源头及目的 流的源头及目的。 区)作为 流的源头及目的。 3) ByteArrayInputStream用来从一个流缓冲区(字节数 用来从一个流缓冲区( 用来从一个流缓冲区 中读入数据, 组)中读入数据, 4) ByteArrayOutputStream用来将数据转换至一个流缓 用来将数据转换至一个流缓 冲区中 5) 由于流对象的内容存放在内存中,所以可提供较快的 由于流对象的内容存放在内存中, 操作。 操作。
当使用流时需要使用java.io包,因此在涉及数 包 当使用流时需要使用 据流操作的程序中都要先导入java.io包: 据流操作的程序中都要先导入 包 import java.io.*;
二、 I/O类层次结构 类层次结构 Java提供超过 个不同的流类型,这些流 提供超过60个不同的流类型 提供超过 个不同的流类型, 类包含在上面提到的java.io包中, 包中, 类包含在上面提到的 包中 四个基本的抽象类: 四个基本的抽象类: InputStream、OutputStream、Reader和 、 、 和 Writer。 。 你不能创建这四个类型的对象,但是其他 的方法的返回值可以是他们
例11-3 ByteIO.java
若输入数据( 中的数据) 若输入数据(data.in中的数据)如下: 中的数据 如下: Aa 00001 92 69 95 Bb 00002 77 92 96 则程序输出如下: 则程序输出如下: Aa 00001 92 69 95 Bb 00002 77 92 96
(一)、OutputStream )、
OutputStream为所有的字节流输出流的父类,因 为所有的字节流输出流的父类, 为所有的字节流输出流的父类 此所有源自于它的类也会继承下列的方法: 此所有源自于它的类也会继承下列的方法: void write(int b):写入一个字节的数据。 写入一个字节的数据。 写入一个字节的数据 void write(byte[] buttfer):讲数组 讲数组buffer的数据写 讲数组 的数据写 入流。 入流。 void write(byte[],int offset int len):从buffer[offset] 从 开始,写入len个字节的数据 个字节的数据。 开始,写入 个字节的数据。 void flush():强制将 强制将buffer内的数据写入流。 内的数据写入流。 强制将 内的数据写入流 void close():关闭流。 关闭流。 关闭流
[内容提要 内容提要] 内容提要 大部分程序都需要数据的输入和输出, 大部分程序都需要数据的输入和输出, 从键盘读取数据, 从键盘读取数据, 向文件写入数据或从文件获取数据, 向文件写入数据或从文件获取数据, 将数据通过打印机打印出来, 将数据通过打印机打印出来, 通过网络进行信息交换
事实上, 事实上,我们经常使用的是 派生自他们的子类。 派生自他们的子类。 java.io包的结构如图 包的结构如图11-1: 包的结构如图 :
三、 标准输入输出 类中有三个静态域System.in、 在System类中有三个静态域 类中有三个静态域 、 System.out和System.err。 和 。 可以在标准位置使用这三个系统流进行I/O操作 操作。 可以在标准位置使用这三个系统流进行 操作。 public static InputStream in 读取字符数据的标准输入流。 读取字符数据的标准输入流。 public static PrintStream out 显示或打印输出信息的标准输出流 public static PrintStream err 输出错误信息的标准错误流。 输出错误信息的标准错误流。
(二)、InputStream )、
InputStream为所有的字节输入流的父类,因此 为所有的字节输入流的父类, 为所有的字节输入流的父类 所有源于它的类也会继承下列的方法: 所有源于它的类也会继承下列的方法: int read():读入一个字节的数据,如果已达到文 读入一个字节的数据, 读入一个字节的数据 件的末端,返回值为 返回值为-1。 件的末端 返回值为 。 int read(byte[] buffer):读出 读出buffer大小的数据, 大小的数据, 读出 大小的数据 返回值为实际所读出的字节。 返回值为实际所读出的字节。 int read(byte[] buffer,int offset,int len):将读出的 将读出的 数据从buffer[offset]开始,写入 个字节至 开始, 数据从 开始 写入len个字节至 buffer中,返回值为实际所读出的字节数目。 中 返回值为实际所读出的字节数目。 int available(): 返回流内可供读取的字节数目。 返回流内可供读取的字节数目。 long skip(long n): 跳过 个字节的数据,返回值 跳过n个字节的数据 个字节的数据, 为实际所跳过的数据数。 为实际所跳过的数据数。 void close(): 关闭流。 关闭流。
(三)、FileInputStream和FileOutputStream )、 和 FileInputStream用来读取一个文件 用来读取一个文件,FileOutPutStream用 用来读取一个文件 用 来将数据写入文件。 来将数据写入文件。 常用的构造函数如下: 常用的构造函数如下: FileInputStream(String name): 打开文件 打开文件name用来读取 用来读取 数据。 数据。 FileInputStream(File file): 打开文件 用来读取数据。 打开文件file用来读取数据 用来读取数据。 FileOutputStream(String name): 打开文件 打开文件name用来写入 用来写入 数据。 数据。 FileOutputStream(File file): 打开文件 用来写入数据。 打开文件file用来写入数据 用来写入数据。 FileOutputStream(String name,Boolean append): 打开文 用来写入数据, 件name用来写入数据,若append为true,则写入的数据 用来写入数据 为 则写入的数据 会加到原有文件后面,否则,覆盖原有的文件。 会加到原有文件后面,否则,覆盖原有的文件。
InputStream FileInputStream
输入流 输出流的类继承关系
OutputStream FileOutputStream ByteArrayOutputStream PipedOutputStream FilterOutputStream BufferedOutputStream PrintStream DataOutputStream
例11-1:标准输入输出举例 :
程序运行如下: 程序运行如下: 输入: 输出: 输入:a,b,c,d 输出:a,b,c,d 输入: 输入复合键CTRL-Z) 输入:^Z (注:输入复合键 )
输出: 输出: program end
第2节 文件的顺序访问 节
一、 字节流 字节流是用来读写8位的数据 位的数据, 字节流是用来读写 位的数据,由于不会对数据 作任何转换,因此可以用来处理二进制的数据。 作任何转换,因此可以用来处理二进制的数据。
常用的构造函数如下: 常用的构造函数如下:
ByteArrayInputStream(byte[] buffer): 生成一个字节数组的 输入流,并指定一个字节数组buffer为此输入流的流缓冲区。 为此输入流的流缓冲区。 输入流,并指定一个字节数组 为此输入流的流缓冲区 ByteArrayOutputStream(): 生成一个字节数组的输出流,其 生成一个字节数组的输出流, 缓冲区的默认初始大小为32字节 若有需要, 字节, 缓冲区的默认初始大小为 字节,若有需要,缓冲区的大小 会随之增加。 会随之增加。 ByteArrayOutputStream(int size): 同上,但分配 同上,但分配size字节的初 字节的初 始大小给此缓冲区。 始大小给此缓冲区。 ByteArrayOutputStream的一些常用方法: 的一些常用方法: 的一些常用方法 int size() : 返回此流缓冲区的大小。 返回此流缓冲区的大小。 byte[] toByteArray() : 生成一个新的字节数组,并将流的内 生成一个新的字节数组, 容复制到此字节数组。 容复制到此字节数组。 String toString() : 将流的内容转换为 将流的内容转换为String对象。 对象。 对象 下面程序读入文件data.in,将其内容写入内存中(一个字节数 将其内容写入内存中( 下面程序读入文件 将其内容写入内存中 ),接着转换为 接着转换为String对象,并将该 对象, 组),接着转换为 对象 并将该String对象内的令牌 对象内的令牌 解析出来。 解析出来。
(一)、OutputStream )、 )、InputStream (二)、 )、FileInputStream和FileOutputStream (三)、 和 )、ByteArrayInputStream和ByteArrayOutputStream (四)、 和 )、BufferedInputStream和BufferedOutputStream (五)、 和
本章介绍Java标准程序库中各种处理 标准程序库中各种处理I/O 操作的类 本章介绍 标准程序库中各种处理 的用途及使用方法。 的用途及使用方法。
第1节 输入 输出概念 节 输入/输出概念
一、 流的概述 Java使用流 使用流(stream)来执行输入输出 来执行输入输出(I/O) 使用流 来执行输入输出 的功能, 的功能,流是一种数据的源头和目的之 间的通信途径。 间的通信途径。 用于读入数据称为输入流(input stream), 用于读入数据称为输入流 , 用于写出数据称为输出流(output stream)。 用于写出数据称为输出流 。
复制为FileExam.ja来自百度文库a.bak。 将FileExam.java复制为 复制为 。
1) 程序首先打开 程序首先打开FileExam.java文件, 文件, 文件 2) 使用read()将其内容逐字节读取出来(如果 将其内容逐字节读取出来( 使用 将其内容逐字节读取出来 返回值为-1,则表明已到达文件尾端), 返回值为 ,则表明已到达文件尾端), 3) 再使用write()将读出的字节逐一写入另一个 再使用 将读出的字节逐一写入另一个 文件FileExam.java.bak中。 文件 中 4) 若文件无法打开(例如FileExam.java不存在) 若文件无法打开(例如FileExam.java不存在 不存在) 或无法生成( ),会抛出 或无法生成(FileExam.java.bak),会抛出 ), FileNotFoundException异常,若读写出错, 异常, 异常 若读写出错, 则会抛出IOException异常。 异常。 则会抛出 异常 5) 最后,我们在 最后,我们在finally中关闭文件。 中关闭文件。 中关闭文件
StringBufferInputStream ByteArrayInputStream SequenceInputStream PipedInputStream FilterInputStream BufferedInputStream
LineNumberInputStream DataInputStream PushbackInputStream
例11-2 FileIO.java
(四)、ByteArrayInputStream和 )、 和 ByteArrayOutputStream
1) 使用这两个流类可以将数据转换到一个数据类型为字 节类型的数组(byte array)中, 节类型的数组( ) 2) ByteArrayInputStream和ByteArrayOutputStream并 和 并 没有牵涉到真正的文件,他们使用内存( 没有牵涉到真正的文件,他们使用内存(一个流缓冲 作为I/O流的源头及目的 流的源头及目的。 区)作为 流的源头及目的。 3) ByteArrayInputStream用来从一个流缓冲区(字节数 用来从一个流缓冲区( 用来从一个流缓冲区 中读入数据, 组)中读入数据, 4) ByteArrayOutputStream用来将数据转换至一个流缓 用来将数据转换至一个流缓 冲区中 5) 由于流对象的内容存放在内存中,所以可提供较快的 由于流对象的内容存放在内存中, 操作。 操作。
当使用流时需要使用java.io包,因此在涉及数 包 当使用流时需要使用 据流操作的程序中都要先导入java.io包: 据流操作的程序中都要先导入 包 import java.io.*;
二、 I/O类层次结构 类层次结构 Java提供超过 个不同的流类型,这些流 提供超过60个不同的流类型 提供超过 个不同的流类型, 类包含在上面提到的java.io包中, 包中, 类包含在上面提到的 包中 四个基本的抽象类: 四个基本的抽象类: InputStream、OutputStream、Reader和 、 、 和 Writer。 。 你不能创建这四个类型的对象,但是其他 的方法的返回值可以是他们
例11-3 ByteIO.java
若输入数据( 中的数据) 若输入数据(data.in中的数据)如下: 中的数据 如下: Aa 00001 92 69 95 Bb 00002 77 92 96 则程序输出如下: 则程序输出如下: Aa 00001 92 69 95 Bb 00002 77 92 96
(一)、OutputStream )、
OutputStream为所有的字节流输出流的父类,因 为所有的字节流输出流的父类, 为所有的字节流输出流的父类 此所有源自于它的类也会继承下列的方法: 此所有源自于它的类也会继承下列的方法: void write(int b):写入一个字节的数据。 写入一个字节的数据。 写入一个字节的数据 void write(byte[] buttfer):讲数组 讲数组buffer的数据写 讲数组 的数据写 入流。 入流。 void write(byte[],int offset int len):从buffer[offset] 从 开始,写入len个字节的数据 个字节的数据。 开始,写入 个字节的数据。 void flush():强制将 强制将buffer内的数据写入流。 内的数据写入流。 强制将 内的数据写入流 void close():关闭流。 关闭流。 关闭流