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