文件输入/输出流

程序运行期间,大部分数据都在内存中被操作,当程序结束或关闭时,这些数据将消失。如果需要将数据永久保存,可使用文件输入/输出流与指定的文件建立连接,将需要的数据永久保存到文件中。本节将讲解文件输入/输出流。

FileInputStream类和FileOutputStream类

FileInputStream 类和 FileOutputStream 类都用来操作磁盘文件。如果用户的文件读取需求比较简单,则可以使用 FileInputStream 类,该类继承自 InputStream 类。FileOutputStream 类与 FileInputStream 类对应,提供了基本的文件写入能力。FileOutputStream 类是 OutputStream 类的子类。

FileInputStream 类常用的构造方法如下:

  • FileInputStream(String name)。

  • FileInputStream(File file)。

第一个构造方法使用给定的文件名 name 创建一个 FileInputStream 对象,第二个构造方法使用 File 对象创建 FileInputStream 对象。第一个构造方法比较简单,但第二个构造方法允许在把文件连接到输入流之前对文件做进一步分析。

FileOutputStream 类具有与 FileInputStream 类相同的参数构造方法,创建一个 FileOutputStream 对象时,可以指定不存在的文件名,但此文件不能是一个已被其他程序打开的文件。下面的实例就是使用 FileInputStream 类与 FileOutputStream 类实现文件的读取与写入功能的。

【例15.3】向文本文件中写入内容,再读取出来(实例位置:资源包\TM\sl\15\3)

使用 FileOutputStream 类和 FileInputStream 类,向 D 盘根目录下的 word.txt 文件中写入一句话,然后读取出来输出到控制台上。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class FileSteamDemo { // 创建类
	public static void main(String[] args) { // 主方法
		File file = new File("D:\\word.txt"); // 创建文件对象
		try { // 捕捉异常
			FileOutputStream out = new FileOutputStream(file); // 创建FileOutputStream对象
			byte buy[] = "我有一只小毛驴,我从来也不骑。".getBytes(); // 创建byte型数组
			out.write(buy); // 将数组中的信息写入到文件中
			out.close(); // 将流关闭
		} catch (Exception e) { // catch语句处理异常信息
			e.printStackTrace(); // 输出异常信息
		}
		try {
			// 创建FileInputStream类对象
			FileInputStream in = new FileInputStream(file);
			byte byt[] = new byte[1024]; // 创建byte数组
			int len = in.read(byt); // 从文件中读取信息
			System.out.println("文件中的信息是:" + new String(byt, 0, len));// 将文件中的信息输出
			in.close(); // 关闭流
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

程序运行之后会向 D 盘根目录下的 word.txt 文件中写入一行文字,并且会在控制台上输出如下信息:

     文件中的信息是:我有一只小毛驴,我从来也不骑。

虽然 Java 在程序结束时自动关闭所有打开的流,但是当使用完流后,显式地关闭所有打开的流仍是一个好习惯。一个被打开的流有可能会用尽系统资源,这取决于平台和实现。如果没有将打开的流关闭,当另一个程序试图打开另一个流时,可能会得不到需要的资源。

FileReader类和FileWriter类

使用 FileOutputStream 类向文件中写入数据与使用 FileInputStream 类从文件中将内容读出来,都存在一点不足,即这两个类都只提供了对字节或字节数组的读取方法。由于汉字在文件中占用两个字节,如果使用字节流,读取不好可能会出现乱码现象,此时采用字符流 FileReader 类或 FileWriter 类即可避免这种现象。

FileReader 类和 FileWriter 类分别对应了 FileInputStream 类和 FileOutputStream 类。FileReader 类顺序地读取文件,只要不关闭流,每次调用 read() 方法就顺序地读取源中其余的内容,直到源的末尾或流被关闭。

下面通过一个实例讲解 FileReader 类与 FileWriter 类的用法。

【例15.4】使用字符流读写文本文件(实例位置:资源包\TM\sl\15\4)

使用 FileWriter 类和 FileReader 类,向 D 盘根目录下的 word.txt 文件中写入一句话,然后读取出来输出到控制台上。

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileReaderDemo {
	public static void main(String[] args) {
		File file = new File("D:\\word.txt"); // 创建文件对象
		try { 
			FileWriter fw = new FileWriter(file); // 创建字符输出流
			String word = "明月几时有,把酒问青天。"; // 写入的字符串
			fw.write(word); // 将字符串写入到文件中
			fw.close(); // 关闭流
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			FileReader fr = new FileReader(file);// 创建字符输入流
			char ch[] = new char[1024]; // 缓存字符数组
			int len = fr.read(ch); // 将文件中的字符读入到缓存数组中
			System.out.println("文件中的信息是:" + new String(ch, 0, len));// 将字符转为字符串输出
			fr.close(); // 关闭流
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

程序运行之后会向 D 盘根目录下的 word.txt 文件中写入一行文字,并且会在控制台上输出如下信息:

     文件中的信息是:明月几时有,把酒问青天。

编程训练(答案位置:资源包\TM\sl\15\编程训练)

【训练3】记录古诗 向D盘根目录下的word.txt文件中写入古诗《春晓》的全文。

【训练4】保存账户密码 将用户的账户密码存入save文件中(读者可自定账户密码)。