ITEEDU

Java Gossip: CharArrayReader、CharArrayWriter

ByteArrayInputStream、ByteArrayOutputStream 即是将位数组当作串流输入来源、输出目的地的工具类别,与其类似的是CharArrayReader与CharArrayWriter,使用它们可以将 字符数组当作字符数据输出或输入的来源。

通常很少会对文本文件进行随机存取的动作,因为为了与ASCII兼容,一个文本文件中可能会有ASCII与双字节字符,也就是说每个字符的长度不一定相同,所以对文本文件进行随机存取容易发生错误。

由于Java中的Char是Unicode字符,藉由这个特性,您可以将文本文件的内容读入字符数组,对字符数组作随机存取,然后再将之写回档案,这么一来对于文本文件您也可以达到类似的随机存取功能,这样的程序在以文字模式为主的编辑器可以应用上。

您开启一个简单的文本文件,当中有简单的ABCDEFG与中文等字符,在读取档案之后,您可以直接以程序来指定文本文件的字符位置,以修改您所指定的字 元,程序的作法是将档案读入数组中,修改位置的指定被用作数组的指针,在修改完数组内容之后,重新将数组存回档案,范例如下:

CharArrayReaderWriterDemo.java
package onlyfun.caterpillar;
import java.io.*;
import java.util.*;
public class CharArrayReaderWriterDemo {
	public static void main(String[] args) {
		try {
			File file = new File(args[0]);
			BufferedReader bufInputReader =
			new BufferedReader(
			new FileReader(file));
			// 将档案读入字符数组
			CharArrayWriter charArrayWriter =
			new CharArrayWriter();
			char[] array = new char[1];
			while(bufInputReader.read(array) != -1)
			charArrayWriter.write(array);
			charArrayWriter.close();
			bufInputReader.close();
			// 显示字符数组内容
			array = charArrayWriter.toCharArray();
			for(int i = 0; i < array.length; i++)
			System.out.print(array[i] + " ");
			System.out.println();
			// 让使用者输入位置与字符修改字符数组内容
			Scanner scanner = new Scanner(System.in);
			System.out.print("输入修改位置:");
			int pos = scanner.nextInt();
			System.out.print("输入修改字符:");
			char ch = scanner.next().charAt(0);
			array[pos-1] = ch;
			// 将字符数组内容存回档案
			CharArrayReader charArrayReader =
			new CharArrayReader(array);
			BufferedWriter bufWriter =
			new BufferedWriter(
			new FileWriter(file));
			char[] tmp = new char[1];
			while(charArrayReader.read(tmp) != -1)
			bufWriter.write(tmp);
			charArrayReader.close();
			bufWriter.flush();
			bufWriter.close();
		}
		catch(ArrayIndexOutOfBoundsException e) {
			e.printStackTrace();
		}
		catch(IOException e) {
			e.printStackTrace();
		}
	}
}

假设文本文件中为:一 个Test!一个测试 !

一个执行程序的范例如下: 

一 个 T e s t ! 一 个 测 试 ! 

输入修改位置:3 
输入修改字符:t?

修改过后,文本文件的内容会是:一个test!一个测试!