From Gossip@Openhome

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!一個測試!