大可制作:QQ群:31564239(asp|jsp|php|mysql)

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