第12章 文件和流_第1页
第12章 文件和流_第2页
第12章 文件和流_第3页
第12章 文件和流_第4页
第12章 文件和流_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第 12 章 文件和流 输入和输出是一个程序必备的功能 Java 的应用程序和 Java Applet 往往经常要通过输 入和输出来读写数据 本章将介绍如何从一个能发送字节或字符序列的 数据源 获得输 入 以及如何将输出发送给能够接收字节序列的一个 目标 字节序列的数据源及目标可 以是文件 也可以是一个网络连接 甚至是一个内存块 在本章中 将重点讨论用来操控 文件的方法 以及用来将数据 可以是对象 实际写入文件 将信息从文件中读回的方法 或者是更新文件的方法 12 1 Java 流类库简介流类库简介 Java 语言的输入输出功能是十分强大而灵活的 它往往需要包装许多不同的对象 在 Java 类库中 I O 部分的内容是很庞大的 因为它涉及的领域很广泛 标准输入输出 文件 的操作 网络上的数据流 字符串流 对象流 zip 文件流 本章的目的是做一个简要的 介绍 12 1 1 流的概念 Java 所有的 I O 机制都是基于数据流的 这些数据流表示了字符或者字节数据的流动序 列 Java 的 I O 流提供了读写数据的标准方法 任何 Java 中表示数据源的对象都会提供以 数据流的方式读写它的数据的方法 流是一个很形象的概念 当程序需要读取数据时 就会开启一个通向数据源的流 这 个数据源可以是文件 内存 或是网络连接 则这就是 输入流 如图 12 1 所示 类似的 当程序需要写入数据的时候 就会开启一个通向目的地的流 这就是 输出流 这时你就 可以想像数据好像在这其中 流 动一样 如图 12 2 所示 图 12 1 输入流示意图 图 12 2 输出流示意图 Java 语言程序设计教程第第 Java 中的流分为两种 一种是字节流 另一种是字符流 分别由四个抽象类来表示 InputStream OutputStream Reader Writer Java 中其他多种多样变化的流均是由它们派 生出来的 下面介绍 Java 的 I O 库 12 1 2 Java 的 I O 库 Java 中的字节流是用于处理字节的输入和输出的 包括读写二进制数据等方面的内容 而 Java 中的字符流则用于处理字符的输入和输出 采用的是 Unicode 编码 可以实现国际 化 使用字符流的另外一个好处就是 字符流比字节流更有效率 1 字节流 在 Java 中 字节流分为 输入流 和 输出流 可以从中读出一系列字节的对象称为 输入流 Input Stream 而能向其中写入一系列字节的对象则称为 输出流 Output Stream 这两种对象分别是由 java io 包中的抽象类 InputStream 和 OutputStream 来实现的 具体的字节流结构如图 12 3 和图 12 4 所示 从图中可以看出 1 字节流的两个顶层类是抽象类 分别是 InputStream 和 OutputStream 2 每个抽象类都有子类来实现具体的功能 处理不同的输入和输出 InputStream 和 OutputStream 类是不能实例化的 实际上在程序中使用就是它们的子类 如文件输入输出流 FileInputStream 和 FileOutputStream 图 12 3 InputStream 类结构图 图 12 4 OnputStream 类结构图 第第第 12 章 文件和流 表 12 1 是字节流的几个常用子类及功能 表 12 1 字节流常用子类及功能 字 节 流 类功能简单介绍 DataInputStream包含了读取 Java 标准数据类型的输入流 DataOutputStream包含了写 Java 标准数据类型的输出流 ByteArrayInputStream从字节数组读取的输入流 ByteArrayOutputStream写入字节数组的输出流 FileInputStream从文件读入的输入流 FileOutputStream写入文件的输出流 PrintStream包含最常见的 Print 和 Println 的输出流 PushbackInputStream返回一个字节到输入流 主要用于编译器的实现 PipedInputStream输入管道 PipedOutputStream输出管道 SequenceInputStream将 n 个输入流联合起来 一个接一个按一定顺序读取 BufferInputStream缓冲输入流 BufferOutputStream缓冲输出流 FilterInputStream实现了 InputStream 接口的过滤器输入流 FilterOutputStream实现了 OutputStream 接口的过滤器输出流 字节流抽象类 InputStream 和 OutputStream 的常用方法如下 1 InputStream 1 abstract int read 读取一个字节的数据 并返回读到的字节 read 方法若遇到数据 流的末尾 便会返回一个 1 值 2 int read byte b 将数据读入一个字节数组 同时返回读回的字节数 和前面一样 如果遇到数据流的末尾 read 方法会返回一个 1 值 读入的最大字节数由 b length 界定 3 int read byte b int off int len 将数据读入一个字节数组 read 会返回读回的实 际字节数 或在流的结尾处返回一个 1 值 其中 b 指定要把字节读入哪个数组 off 指定数组的偏移位置 第一个字节应放在哪个位置 len 读回的最大字节数 4 long skip long n 在输入流中跳过几个字节 它返回的实际跳过的字节数 如果 遇到流的末尾 这个数字则可能小于 n 5 int available 返回在不加阻止的情况下 可用的字节数 阻止 是指当前线 程必须暂停 等待下一次被唤醒 6 void close 关闭输入流 2 OutputStream 1 abstract void write int b 写入一个字节的数据 2 void write byte b 写入数组 b 内的所有字节 3 void write byte b int off int len 功能和上面的方法一样 其中 b 指定要从哪个数组写入数据 Java 语言程序设计教程第第 off 指定数组 b 的一个偏移位置 从哪个位置的字节开始写入 len 要写入的字节数量 4 void close 清空和关闭输出流 5 void flush 清空输出流 换言之 将缓冲下来的所有数据都发到目的地 对于 缓冲流式输出来说 write 方法所写的数据并没有直接发送到输出流的目标端 而是先暂时 存放在流的缓冲区中 等到缓冲区中的数据达到一定的数量后 再一次性的向目标端写出 但在某些情况下 缓冲区中的数据不满时就需要将它写到目标端 这时就需要使用 flush 方 法 2 字符流 同字节流类似 字符流也是通过两个顶层的抽象类 Reader 和 Writer 的子类来实现对 Unicode 字符 在 Java 中一个字符由两个字节组成 流的处理 如图 12 5 和图 12 6 所示 从图中可以看出 1 字符流的两个顶层类是抽象类 分别是 Reader 和 Writer 2 每个抽象类都有子类来实现具体的功能 处理不同的设备的输入和输出 图 12 5 Reader 类结构图 图 12 6 Writer 类结构图 字符流的几个常用子类及功能见表 12 2 表 12 2 字符流常用子类及功能 第第第 12 章 文件和流 字 符 流 类功能简单介绍 StringReader从字符串读取的输入流 StringWriter写入字符串的输出流 FileReader从文件读入的输入流 FileWriter写入文件的输出流 续 字 符 流 类功能简单介绍 PushbackReader返回一个字符到输入流 主要用于编译器的实现 PipedReader输入管道 PipedWriter输出管道 CharArrayReader从字符数组读取的输入流 CharArrayWriter写入字符数组的输出流 BufferReader缓冲输入流 BufferWriter缓冲输出流 FilterReader实现了 InputStream 接口的过滤输入流 FilterWriter实现了 OutputStream 接口的过滤输出流 InputStreamReader将字节转换为字符的输入流 OutputStreamWriter将字节转换为字符的输出流 对比表 12 1 和表 12 2 可以发现 字符流很多的类名的作用和字节流都差不多 这些 方法的不同之处仅仅在于一个是针对字节的 一个是针对字符的 而且在 Reader 和 Writer 类中提供的基本方法也和 InputStream 和 OutputStream 的基本方法一样 最主要是 read 和 write 方法 public abstract int read throws IOException public abstract void write throws IOException 其它的方法与 InputStream 和 OutputStream 类的那些方法类似 这里不再重复 当然 这些 方法处理的是 Unicode 字符 而 InputStream 和 OutputStream 类的方法处理的是字节 12 2 基本流基本流 Java 的基本流完成程序中最基本的输入输出工作 12 2 1 标准的输入和输出 在 Java 编程环境中 标准输入和输出的概念和 C C 语言中的相似 它有 3 个内置的 标准流对象 本书第二章已经作了介绍 它们是 标准输入流 System in 标准输出流 System out 标准出错流 System err 在前面的章节多次用到这几个对象 读者可能对这几个标准对象已很熟悉了 Java 程 序就是通过 System in System out 和 System err 来实现标准输入输出和标准错误输出 例 12 1 标准输入输出演示 StdInOut java import java io public class StdInOut public static void main String args char c a int i count 0 byte buffer new byte 100 Java 语言程序设计教程第第 System out print Input a char try c char System in read 输入一个字节并转化为字符 c System in skip 2 跳过输入字符后的回车 catch IOException ioe System err println ioe toString System out println c System out print Input a String try count System in read buffer 输入若干字节到字节数组 buffer catch IOException ioe System err println ioe toString for i 0 i count 1 i System out print char buffer i 在这个程序中 当程序执行到 read 方法时就停下来 等待用户的键盘输入 用户 在输入一个字符后 需要再输入一个回车符 以保证 read 可以读到这个字符 read 方法读入字符后返回 int 型的变量 所以需要强制的类型转换符 char 把它转换成 char 后 再复制给 char 类型的变量 c 由于输入操作有可能会抛出 IOException 异常 所以要用 try catch 块进行异常处理 第二次用户同样用 read 方法读入一串字符 运行效果如图 12 7 所示 图 12 7 例 12 1 的运行效果图 12 2 2 利用 Java io 类库 除了上述的 3 个对象 还可以通过 java io 包中提供的流类接收键盘的输入 在程序中 经常用到了前面提到的 InputStreamReader BufferReader 类 InputStreamReader 是字节流通 向字符流的桥梁 它读取字节并将其解码为字符 每次调用 InputStreamReader 中的一个 read 方法都会导致从基本输入流读取一个或多个字节 要启用从字节到字符的有效转换 可以提前从基本流读取多个字节 这就需要 BufferReader 来设立缓冲区 然后用 readLine 方法读入一行字符 方法如下 InputStreamReader isr new InputStreamReader System in BufferedReader br new BufferedReader isr br readLine 在实际的程序中经常还需要通过 java text 包中的 NumberFormat 类来将字符串转化为相应类 型的数据 第第第 12 章 文件和流 例 12 2 使用流类实现键盘输入一个浮点数的程序 ReadDouble java import java io import java text public class ReadDouble public static void main String args InputStreamReader isr new InputStreamReader System in BufferedReader br new BufferedReader isr String s try s br readLine try 通过子类 DecimalFormat 创建一个 NumberFormat 类对 象 NumberFormat df new DecimalFormat double x df parse s doubleValue System out println x catch ParseException e 若输入的字符无法转换 则抛出 ParseException 异常 System out println e toString 在这个程序中还用了标准输入对象 System in 来创建了 InputStreamReader 类的对象 isr 通过 isr 对象创建了一个缓冲输入流 BufferedReader 的对象 bf 然后用 readLine 方法从 原始输入流 这里是键盘 读入数据 最后通过 NumberFormat 类的对象 df 实际是其子类 DecimalFormat 的对象 把输入字符变为浮点数 当然也可以使用 intValue longValue 等 方法得到其它类型的数据 NumberFromat 类也可以用来控制输出的格式 它有三种使用标准格式的方法 数值 货币数 百分数 例如可以将 3333 333 按以下三种情况输出 3 333 333 附加逗号 3 333 333 货币符号 3333 333 百分号 可以使用下列的方法 NumberFormat getNumberInstance NumberFormat getCurrencyInstance NumberFormat getPercentInstance 每种方法都返回一个 NumberFormat 类的对象 可以使用该对象来格式化一个或多个数 因 此可以应用 NumberFormat 对象的 format 方法来获得一个包含格式化数的字符串 参见例 12 3 例 12 3 格式化输出 OutputTest java import java text public class OutputTest public static void main String args Java 语言程序设计教程第第 double x 3333 333 String numberfx currencyfx percentfx NumberFormat numbernf NumberFormat getNumberInstance NumberFormat currencynf NumberFormat getCurrencyInstance NumberFormat percentnf NumberFormat getPercentInstance numberfx numbernf format x currencyfx currencynf format x percentfx percentnf format x System out println numberfx System out println currencyfx System out println percentfx 例 12 3 的运行效果如图 12 8 所示 图 12 8 例 12 3 的运行效果 Java 假定美国 United States Locale 为默认区域 Locale 是一组国家指定的字符串 数据串和数组的性质说明 例如核对订单 货币符号等 对于编写国际化应用程序来说 区域 Locale 是一个重要的概念 也可以获得适合于不同区域的数据格式 例如 查看德 国区域 Germany Locale 所用的数据格式 并使用它们打印测试的输出 这是可以预定义 的称之为 Locale 新类型的名叫 Locale GERMANY 的对象 它知道德国数的格式规则 获得 一个遵循这些德国规则的格式 例如 double x 3333 333 NumberFormat nf NumberFormat getNumberInstance Locale GERNAMY System out println nf format x NumberFormat nf NumberFormat getCurrencyInstance Locale GERMANY System out println nf format x 这个代码打印如下数 3 333 333 3 333 33DM 注意 在数中 句号和逗号的 German 德国 变换要求与 U S 美国 变换相反 一个逗号 用作十进制数分隔符 而句号用作分隔千 格式符知道货币符号放在数后面 用户还可以创建自己的格式 例如 程序中可能要求显示在小数后面具有 6 位数的数 但无千分隔符 为此 必须定义一个 DecimalFormat 对象以指明数据所需采用的格式 在格 式串中指明格式的要求 例如 DecimalFormat df new DecimalFormat 0 System out println df format x 这个代码以下列格式打印数 3333 333333 可使用表 12 3 所示的格式串表示的字符 表 12 3 DecimalFormat 类的格式字符 符 号含 义 第第第 12 章 文件和流 0一个数字 一个数字 如果它是一个前导或尾数零 则不显示 十进制数分隔符的位置 成组分隔符的位置 对于整数和负数的分隔形式 负数前缀 乘以 100 并显示为百分数 DecimalFormat 类对于诸如货币之类的格式化数工作很好 然而 它并不适合于科学计 算 java math BigDecimal 可以用它来实现浮点数的精确表示和计算 这和本章内容无关 不再深入讲解 感兴趣的读者可以自己查阅相关资料 12 3 数据流数据流 前一小节介绍的基本流主要是对文本形式的数据进行读写 也可以将本文形式的数据 转换成 Java 中的数据类型 而本身是二进制类型的数据 Java 语言中也提供了数据流来进 行输入和输出 数据流支持所有 Java 中的基本类型 可以通过分别实现了 DataOutput 和 DataInput 两个接口的 DataOutputStream 和 DataInputStream 类中的方法对基本类型数据进行 读写 DataOutputStream 和 DataInputStream 类是按照字节方式进行读写 实际上就是按照 Java 各种数据类型的字节数读入和写出若干字节 然后组装成相应类型的数据 下面对这 个类做个简单的介绍 本章文件读写的小节将会有数据流使用的实例 12 3 1 java DataInput 接口 DataInputStream 实现的 DataInput 接口中的主要方法有如下一些 1 boolean readBoolean 读入一个布尔值 2 byte readByte 读入一个 8 位字节 3 char readChar 读入一个 16 位的字符 4 double readDouble 读入一个 64 位 double 字符 5 float readFloat 读入一个 32 位 float 字符 6 void readFully byte b 读字节 直到读所有字节才封锁 参数 b 为读入数据的缓 冲区 7 void readFully byte b int off int len 读字节 直到读所有字节才封锁 参数 b 为读 入数据的缓冲区 off 为数据的起始偏移量 len 为写的字节数 8 int readInt 读一个 32 位整数 9 long readLong 读入一个 64 位的长整数 10 short readShort 读入一个 16 位的短整数 11 int skipByte int n 跳过若干个字节 直到跳过所有的字节才封锁 n 为跳过的 字节 12 3 2 Java DataOutput 接口 DataOutputStream 实现的 DataOutput 接口中的主要方法如下 1 void writeBoolean boolean b 写一个布尔值 2 void writeByte byte b 写一个 8 位字节 Java 语言程序设计教程第第 3 void writeChar char c 写一个 16 位字符 4 void writeFloat float f 写 32 位 float 数 5 void writeDouble double d 写 64 位 double 数 6 void writeInt int I 写 32 位整数 7 void writeLong long l 写 64 位长整数 8 void writeShort short s 写 16 位短整数 12 4 文件流文件流 在 Java 的 I O 中 文件流是用得比较广泛的一种流形式 它以磁盘文件为输入或输出 的原始数据和目的 在 Java 中 把文件看成是一个字符 字节 的序列 根据数据的组织 形式 可将文件分为文本文件和二进制文件 在文本文件中 每一个字节存放一个 ASCII 码 代表一个字符 二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁 盘文件上存放 因此文件流也就根据所针对的文件类型的不同而分为文本流和二进制流 在 Java 的 I O 库中 抽象类 Reader 和 Writer 只能用来对文本文件进行操作 而抽象类 InputStream 和 OutputStream 可以对文本文件或二进制文件进行操作 12 4 1 二进制文件的读写 1 使用 FileOutputStream 和 DataOutputStream 进行二进制文件的写 FileOutputStream 是 OutputStream 的子类 实现的写文件的操作 它和具体的文件关联 二进制文件的写通常要用到 DataOutputStream 类 在前面已经学过 这个类实现了 DataOutput 接口 提供了很多 Java 中数据类型的输出方法 但它还要通过过滤流和一个具 体的磁盘文件合并到一起 过滤流是指将 Java 流中的多个流类通过构造函数组装到一起 使组装后的流类具有多个流个功能 格式如下 FileOutputStream out new FileOutputStream 路径和文件名 DataOutputStream dos new DataOutputStream out 或 DataOutputStream dos new DataOutputStream new FielOutputStream 路径和文件名 然后可以用 DataOutputStream 方法向文件写入数据 它是按照数据在内存的二进制形式直 接写入文件的 如用定义的 dos 对象向文件中写入浮点数和整型数 dos writeDouble dos writeInt 在例 12 4 中 向文件的 myfile dat 中写入了三个浮点数 例 12 4 把三个浮点数写入文件 myfile dat 的示例程序 FileOutputDemo java import java io public class FileOutputDemo public static void main String args FileOutputStream out DataOutputStream p try out new FileOutputStream myfile dat p new DataOutputStream out p writeDouble 3 0 p writeDouble 4 0 p writeDouble 5 0 第第第 12 章 文件和流 p close catch Exception e System err println Error writing to file 上面的程序中打开了一个二进制文件 myfile dat 然后向这个文件中按二进制形式写入 三个 double 数 3 0 4 0 5 0 运行上述文件后 打开 myfile dat 文件就可以看到为每个 double 数分配了 64 位的空间 存放了 3 0 4 0 5 0 下面试图从这个文件中读出这三个数 2 使用 FileInputStream 和 DataInputStream 进行二进制文件的读 FileInputStream 是 InputStream 的子类 实现的写文件的操作 它和具体的文件关联 二进制形式文件的读 通常要用到 DataInputStream 类 已经知道 这个类实现了 DataInput 接口 提供了有用的输入方法 但它还要通过过滤流和一个具体的目标合并到一起 格式 如下 FileInputStream in new FileInputStream 路径和文件名 DataInputStream dis new DataInputStream in 当然也可以写成 DataInputStream dis new DataInputStream new FileInputStream 路径和文件名 然后用前面介绍的数据流的方法读入文件中的数据 如 double d dis readDouble int i dis readInt 例 12 5 按二进制形式读入文件 myfile dat 中的浮点数的示例程序 FileInputDemo java import java io class FileInputDemo public static void main String args if args length 1 try FileInputStream fstream new FileInputStream args 0 DataInputStream in new DataInputStream fstream while in available 0 System out println String valueOf in readDouble in close catch Exception e System out println File input error else System out println Invalid parameters 该程序通过命令行的方式读入文件名 打开文件并按二进制形式输入所有的浮点数 则会得到 3 0 4 0 5 0 三个浮点数 运行效果如图 12 9 所示 Java 语言程序设计教程第第 图 12 9 例 12 5 的命令行参数和运行效果 例 12 6 实现二进制文件之间的复制的示例程序 copyFile java import java io public class copyFile public static void main String args throws IOException int n FileInputStream fin FileOutputStream fout try try fin new FileInputStream args 0 通过命令行打开源文件 catch FileNotFoundException e System err println e return try fout new FileOutputStream args 1 打开目标文件 catch FileNotFoundException e System err println e return catch ArrayIndexOutOfBoundsException e System err println e return try do n fin read 文件之间数据复制 if n 1 fout write n while n 1 catch IOException e System err println e fin close 关闭两个文件 fout close 这个程序通过两个命令行形式输入需要复制的文件源文件名和目标文件名 然后用 read 和 write 两个方法一个一个字节的复制过去 直到源文件读到最后一个字节为止 12 4 2 文本文件的读写 尽管二进制读写的速度非常快 效率也很高 但遗憾的是 人们无法直接对二进制文 第第第 12 章 文件和流 件加以识别 在本节中 将把重点放在文本文件的读和写 在 Java 中 采用的是 Unicode 字符 也就是说 1234 这个字符串的字符编码是 00 31 00 32 00 33 00 34 十六进制 但在 Java 目前运行的环境中 它们使用的都是自己的一套 字符编码 可能是单字节 双字节或可变字节 比如在 Windows 环境中 字符串使用的是 ASCII 编码 即 31 32 33 34 如果直接将 Unicode 编码写入一个文本文件 那么使用主机环 境将无法正确识别这个文本文件 为了解决这个问题 Java 提供了一个过滤流 可以用来 弥补 Unicode 编码和本机操作系统采用的字符编码间的裂缝 所有的这些类都是从抽象类 Reader 和 Writer 中派生出来的 InputStreamReader 类可以将采用特殊编码方式的一个输入流转换成一个 character 即 Java 中的 Unicode 字符 同样 OutputStreamWriter 类可以将一个 Java 中的 Unicode 字符转 换成采用特殊编码方式的字节流 例如 要按照主机运行环境默认的编码方式读取文本文件 myfile txt 中的字符 可采用 如下方式 FileInputStream fis new FileInputStream myfile txt InputStreamReader isr new InputStreamReader fis 当然也可以采用如下形式 InputStreamReader isr new InputStreamReader new FileInputStream myfile txt 则相应的写文件 可采用如下方式 FileOutputStream fos new FileOutputStream myfile txt OutputStreamWriter osw new InputStreamReader fos 当然也可以采用如下形式 OutputStreamWriter osw new OutputStreamWriter new FileOutputStream myfile txt 由于经常要将一个 Reader 和 Writer 同文件联系在一起 所以 Java 专门为此提供了两个 类 FileReader 和 FileWriter 那么上面的形式又可以等价如下形式 FileReader fr new FileReader myfile txt FileWriter fw new FileWriter myfile txt 下面是一些文本文件读写的例子 1 写文本文件 1 用 FileOutputStream 来写入数据的常用方法是 FileOutputStream out new FileOutputStream myfile txt PrintStream p new PrintStream out 使用 PrintStream 类的目的是为了能够使用 p println 或者 p print 来写入数据 如果直 接 OutputStreamWriter 类 只能使用 write 写入文件 最后用 p close 关闭输出 例 12 7 用 FileOutputStream 写入文本文件的示例程序 FileOutputDemo java import java io public class FileOutputDemo public static void main String args FileOutputStream out PrintStream p try Java 语言程序设计教程第第 out new FileOutputStream myfile txt p new PrintStream out p println This is written to a file p close catch Exception e System err println Error writing to file 在这个程序中 用 FileOutputStream 打开文件 myfile txt 然后用 PrintStram 对象 p 的 pintln 方法写入文件中 程序运行后会在当前目录下创建一个文本文件 myfile txt 其中文本 文件中有程序中写入的字符串 结果如图 12 10 所示 图 12 10 文本文件 myfile txt 的内容 2 用 FileWriter 来写入文件的常用方法是 FileWriter fw new FileWriter mydata txt PrintWriter out new PrintWriter fw PrintWriter 和 PrintStream 一样可以使用 out print 或 out println 往文件中写入数据 写完后 要用 out close 关闭输出 用 fw close 关闭文件 例 12 8 用 FielWriter 来写入文本文件的示例程序 FileWriteTest java import java io public class FileWriteTest public static void main String args FileWriteTest t new FileWriteTest t WriteMyFile void WriteMyFile try FileWriter fw new FileWriter mydata txt PrintWriter out new PrintWriter fw out print hi this will be wirte into the file out close fw close catch IOException e System out println Uh oh got an IOException error e printStackTrace 在这个程序中用 FileWriter 打开了文本文件 mydata txt 又创建了文本输出流 out 用 out 的 print 方法向文本文件写入了一个字符串 最后关闭文件流和文件 程序运行后文本文 件如图 12 11 所示 第第第 12 章 文件和流 图 12 11 文本文件 mydata txt 的内容 2 读文本文件 1 用 FileInputStream 来读取数据的常用方法是 FileInputStream fstream new FileInputStream args 0 DataInputStream in new DataInputStream fstream 用 in readLine 来得到数据 然后用 in close 关闭输入流 例 12 9 用 FileInputStream 类读文本文件 myfile txt 的示例程序 FileInputDemo java import java io public class FileInputDemo public static void main String args try FileInputStream fstream new FileInputStream myfile txt DataInputStream in new DataInputStream fstream while in available 0 System out println in readLine in close catch Exception e System err println File input error 上面的程序用 FileInputStream 类来打开例 12 8 中创建的文本文件 myfile txt 然后建立 DataInputStream 的对象 in 文件流 使用 in 的方法 readLine 以一行为单位读出 myfile txt 文本文件中的所有字符串 程序运行效果如图 12 12 所示 图 12 12 例 12 9 的运行效果 2 用 FileReader 来读取文件的常用方法是 FileReader fr new FileReader mydata txt BufferedReader br new BufferedReader fr BufferedReader 实现了缓冲输入 用 br readLing 来读出数据 然后用 br close 关闭缓存 用 fr close 关闭文件 例 12 10 用 FileReader 类来读取文本文件 mydata txt 的示例程序 FileReadTest java import java io public class FileReadTest public static void main String args Java 语言程序设计教程第第 FileReadTest t new FileReadTest t readMyFile void readMyFile String record null int recCount 0 try FileReader fr new FileReader mydata txt BufferedReader br new BufferedReader fr record new String while record br readLine null recCount System out println recCount record br close fr close catch IOException e System out println Uh oh got an IOException error e printStackTrace 在上面的程序中 首先用 FileReader 类来打开例 12 8 中创建的文本文件 mydata txt 然 后用 BufferedReader 类的对象 br 作为文件流 用 br 的方法 readLine 读取文本文件中的字 符串 并且加上行号 打印出来 运行效果如图 12 13 所示 图 12 13 例 12 10 的运行效果 上面通过几个例子向大家讲解了在 Java 中如何实现对文本文件的读取 你会发现在 Java 中 系统库提供了大量的类和方法支持 Java 的 IO 操作 Java 的 IO 甚至比 C 语言更加 简单和方便 下面再来看一个比较复杂的例子 假定有一个 Employee 员工类 先将多个员工记录数 组写入文件 再将它们读回内存 每个员工对象都由姓名 工资 参加工作时间三个部分 组成 在这个例子中用三个员工的数据组成一个数组 并把它写入到文本文件 employee dat 中 在文本文件中 每一个员工占用一行 在一行中的不同数据之间用一个 分隔 如 Harry Hacker 37363 75 1989 10 5 Carl Cracker 78937 5 1988 0 0 Tony Tester 39995 0 1990 3 2 下面是示例程序 例 12 11 数据文件的使用 DataFileTest java import java io import java util public class DataFileTest static void writeData Employee e PrintWriter out throws IOException 第第第 12 章 文件和流 out println e length int i for i 0 i e length i e i writeData out static Employee readData BufferedReader in throws IOException int n Integer parseInt in readLine Employee e new Employee n int i for i 0 i n i e i new Employee e i readData in return e public static void main String args Employee staff new Employee 3 创建一个一维数组对象 staff 0 new Employee Harry Hacker 35500 new Date 1989 10 1 初始化一维数组 staff 1 new Employee Carl Cracker 75000 new Date 1987 12 15 staff 2 new Employee Tony Tester 38000 new Date 1990 3 15 int i for i 0 i staff length i staff i raiseSalary 5 25 try 打开文件并写入文件 PrintWriter out new PrintWriter new FileWriter employee dat writeData staff out out close catch

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论