星期三, 4月 15, 2009

Java I/O

利用現在難得空閒(原本要講 Java Technicalities 因故延期 XD)來寫一下這篇前幾天想寫的東西好了

Java I/O 和 C++ I/O 都是採取 OO 做為設計準則,所以其實 Java I/O 並不難懂,難懂的是,為什麼會有這麼多名詞 ... Orz,其實 Java I/O 大至上可以分為

  • InputStream/ OutputStream - 一次讀取以 1 byte 為單位
  • Reader/ Writer - 一次讀取以1 char 為單位

由於 Java String 是以 UTF-8 為 default encoding ,所以如果使用 Reader/ Writer ,1 char = ?? bytes ,其實談到 I/O 與 string 躲不掉的就是編碼問題,可是這我也不懂,我們再來大概分類一下XD

  • InputStream/ OutputStream
    • StringBufferInputStream/ StringBufferOutpuStream - 如前文所提,String 並不一定是 1 char = 1 byte,所以此 class 已經不被建議使用
    • ByteArrayInputStream/ ByteArrayOutputStream - 如果你很肯定你的 String 的單位是 1 byte,可以使用這個 class + String.getBytes() 來使用
    • FileInputStream/ FileOutputStream - 檔案用的 XD
    • Socket.getInputStream()/ Socket.getOutputStream() - 很明顯,這是 Socket Programming 用的XD
    • Process.getInputStream()/ Process.getOutputstream() - 這是 Process Control 用的 XD 需用 ProcessBuilder 來建立 Process
  • Reader/ Writer
    • StringReader/ StringWriter - 官方建議用來讀取 String 的 class
    • FileReader/ FileWriter - for file
    • CharArrayReader/ CharArrayWriter - 我不想說了XD

其實還有很多沒提到的,但是我們可以把上述的的class再分別接到(做為以下 contructor argument)...

  • InputStream/ OutputStream
    • BufferedInputStream/ BufferedOutputStream - 加上 buffer
    • DataInputStream/ DataOutputStream - 支援格式化輸入輸出
  • Reader/ Writer
    • BufferedReader/ BufferedWriter - 同樣支援 readLine()/ writeLine()
    • 格式化輸入輸出我就不知道了,不過有想到Scanner 可以格式化輸入

看到這邊其實蠻亂的,不過這就是Java...Orz 其實只要記得有兩套方法就可以了,偏偏又跑出一個兩者的單向橋樑...

  • InputStreamReader/ OutputStreamWriter - 讓 InputStream/ OutputStream 可以橋接到Reader/ Writer 去,反之不行

其實原因還蠻簡單的,今天我收到的 InputStream/ OutputStream 裡面的字元不一定是以 1 byte 為單位啊(其實知道 encoding 的話,也不難辦),例如說我從 Socket 收到的訊息採用 UTF-8 的話,我們就可以寫出這種程式碼 XD

Socket connect = new Socket("balabala");
BufferedReader br = new BufferedReader(new InputStreamReader(connect.getInputStream()));

那麼其他沒有提到的有...

  • RandomAccessFile
  • ObjectInputStram/ ObjectOutputStream
  • java.nio

以後有空再說吧(以後真的會有空嗎... XD)


---
這篇倒是寫蠻快的 XD

張貼留言