From Gossip@Openhome

Java Gossip: PrintStream

之前所介紹過的Stream輸出物件,都是直接將記憶體中的資料寫出至目的地(例如一個檔案),舉個例子來說,如果您將 int 整數 1 使用之前介紹的Stream物件輸出至檔案,則檔案中所儲存的是 int 整數 1 在記憶體中的值,例如:
  • FileStream.java
package onlyfun.caterpillar;

import java.io.*;

public class FileStreamDemo {
public static void main(String[] args)
throws IOException {
FileOutputStream file =
new FileOutputStream(
new File("test.txt"));
file.write(1);
file.close();
}
}

由於您使用write()方法,這會將 1 在記憶體中的值之低位元組0000001寫入檔案中,所以如果您使用文字編輯軟體(像vi或UltraEdit)觀看test.txt的16進位表示,其結果會顯示 01(16進位表示)。

有時候您所想要儲存的結果是轉換為字元之後的結果,例如若程式的執行結果是3.14159,您會希望使用字元來儲存3.14159,也就是俗稱的儲存為純文字檔案,如此當您使用簡單的純文字編輯器觀看時,就可以直接看到程式執行的結果。

例如您若想使用純文字檔案看到test.txt的顯示結果是1,則必須先將記憶體中的整數1,也就是二進位00000000 00000000 00000000 00000001轉換為對應的字元編碼,也就是0x31(十進位表示49)並加以儲存。

使用PrintStream可以自動為您進行字元轉換的動作,它會使用作業系統的預設編碼來處理對應的字元轉換動作,直接使用下面這個例子來作示範:

  • PrintStreamDemo.java
package onlyfun.caterpillar;

import java.io.*;

public class PrintStreamDemo {
public static void main(String[] args)
throws FileNotFoundException {
PrintStream printStream = new PrintStream(
new FileOutputStream(
new File("pi.txt")));

printStream.print("PI = ");
printStream.println(Math.PI);

printStream.close();
}
}

執行程式之後使用純文字編輯器開啟pi.txt,其內容會是PI = 3.141592653589793,print()或println()接受int、char、String、double等等資料型態, println()會在輸出之後加上換行字元,而print()則不會。

注意在檔案儲存上實際並沒有二進位檔案或是純文字檔案的分別,所有的檔案所儲存的都是二進位的資料,您俗稱的純文字檔案,其實正確的說,是指儲存的結果是經過字元轉換,例如將 int 整數 1轉換為字元 '1' 的編碼結果並加以儲存。