ByteArrayInputStream、ByteArrayOutputStream 即是将位数组当作串流输入来源、输出目的地的工具类别,与其类似的是CharArrayReader与CharArrayWriter,使用它们可以将 字符数组当作字符数据输出或输入的来源。
通常很少会对文本文件进行随机存取的动作,因为为了与ASCII兼容,一个文本文件中可能会有ASCII与双字节字符,也就是说每个字符的长度不一定相同,所以对文本文件进行随机存取容易发生错误。
由于Java中的Char是Unicode字符,藉由这个特性,您可以将文本文件的内容读入字符数组,对字符数组作随机存取,然后再将之写回档案,这么一来对于文本文件您也可以达到类似的随机存取功能,这样的程序在以文字模式为主的编辑器可以应用上。
您开启一个简单的文本文件,当中有简单的ABCDEFG与中文等字符,在读取档案之后,您可以直接以程序来指定文本文件的字符位置,以修改您所指定的字 元,程序的作法是将档案读入数组中,修改位置的指定被用作数组的指针,在修改完数组内容之后,重新将数组存回档案,范例如下:
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!一个测试!