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