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!一个测试!