文本IO

来自CloudWiki
Cloud17讨论 | 贡献2018年4月25日 (三) 08:13的版本 FileReader和FileWriter
跳转至: 导航搜索

Reader和Writer

Java IO中的java.io.Reader和java.io.Writer的工作原理很像InputStream和OutputStream,但不同的是reader和writer是基于字符的,他们是用来用些文本数据的。其类层级结构如图6-13所示。

文件:Java6-13.png

图6-13 字符流结构

Reader用于读取字符流的抽象类。Reader类的常用方法如表6-7所示。

表6-7 Reader类常用方法
方法名	说明
boolean ready()	输入字符流是否可读
int read()	读取一个字符
int read(char[] cbuf)	读取一串字符(到字符数组cbuf)
long skip(long n)	跳过n个字符
mark(int readAheadLimit)	在当前位置做一标记
reset()	将读取位置恢复到标记处
close()	关闭字符流

Writer是写入字符流的抽象类。Writer类的常用方法如表6-8所示。

表6-8 Writer类常用方法

方法名	说明
void close()	关闭流
void flush()	强行写入
void write(int c)	写入c
void write(char[] cbuf)	写入字符数组cbuf
void write(char[] cbuf, int off, int len)	写入字符数组cbuf中自位置off开始的len个字符
void write(String str)	写入字符串str
void write(String str, int off, int len)	写入字符串str中自位置off开始的len个字符

FileReader和FileWriter

FileReader:与FileInputStream对应,主要用来读取字符文件,使用缺省的字符编码,常用的构造函数如表6-9所示。

表6-9 FileReader类构造方法 构 造 方 法 说 明

FileReader(File file)	使用File对象创建文件输入流对象,如果文件打开失败,将抛出异常
FileReader(String name)	使用文件名或路径创建文件输入流对象,如果文件打开失败,将抛出异常
FileWrite:与FileOutputStream对应 ,将字符类型数据写入文件,使用缺省字符编码和缓冲器大小,常用的构造函数如表6-10所示。

表6-10 FileWriter类构造方法

构 造 方 法	说    明
FileWriter(File file)	使用File对象创建文件输出流对象,如果文件打开失败,将抛出异常,必须捕捉
FileWriter(File file, boolean append)	使用File对象创建文件输出流对象,并由参数append指定是否追加,异常情况同上
FileWriter(String name)	直接使用文件名或路径创建文件输出流对象,异常情况同上
FileWriter(String name, boolean append)	直接使用文件名或路径创建文件输出流对象,并由参数append指定是否追加,异常情况同上

使用try-with-resource自动关闭资源

在编写IO操作时经常会忘记关闭IO流,JDK7提供了新的try-with-resource语法来自动关闭IO流,语法格式如下:

try(声明和创建资源){
	使用资源来处理文件
}

下面程序使用FileReader和Writer将“Hello World”写入文件reader.txt,并读取打印出来。

public static void main(String[] args) throws IOException {
		//把内容写入到文件中
		try (FileWriter fw = new FileWriter("reader.txt");
			) {
			String str = "hello world";
			fw.write(str.toCharArray());
		}
		//把内容显示在屏幕上
		try(FileReader fr= new FileReader("reader.txt")){
			char[] c=new char[20];
			int hasRead=0;
			while((hasRead=fr.read(c))!=-1) {
				System.out.print(new String(c,0,hasRead));
			}
		}		
}

BufferedReader和BufferedWriter

使用FileRead和FileWriter从文件中逐个地读取/写入字符,效率比较低下,因此一般将该类对象包装到缓冲流(BufferedReader和BufferedWriter)中进行操作。BufferedReader和BufferedWriter与BufferedInputStream和BufferOutputStream操作类似,使用缓冲方式文本读取/写入,初次之外还提供了readLine()和newLine()方法,从而提高了读写的效率。

下面程序使用BufferedReader和BufferedWriter完成文件的写入和读取。

public static void main(String[] args) throws IOException {
		// 把内容写入到文件中
		try (FileWriter fw = new FileWriter("reader.txt"); BufferedWriter bw = new BufferedWriter(fw);) {
			String str = "hello world";
			bw.write(str);
			bw.newLine();
			bw.write("good good study");
		}
		// 把内容显示在屏幕上
		try (FileReader fr = new FileReader("reader.txt"); BufferedReader br = new BufferedReader(fr)) {
			while (br.ready()) {
				System.out.println(br.readLine());
			}
		}
	}

返回 Java程序设计