利用現在難得空閒(原本要講 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