1. 二進制IO操作
主要通過InputStream和OutputStream類及其子類進行。方法和文本操作類似。
FileInputStream和FileOutputStream用于操作文件。
BufferedInputStream和BufferOutputStream和文本操作類似,只是默認的緩沖區大小為512字節。
DataInputStream和DataOutputStream用于包裝InputStream和OutputStream,直接進行字符、實數、整數、布爾值等的讀寫。
DataOutputStream中writeChar方法寫入Unicode編碼,如果要寫入ASCII嗎,使用writeByte。
2. UTF編碼
UTF編碼存儲字符使用的字節數不固定,小于0x7F的ASCII碼用一個字節表示,小于0x7FF的Unicode編碼用兩個字節表示,其余的Unicode編碼用三個字節表示。
UTF編碼的開頭幾位表示該字符使用的字節數。如果第一位是0,則是單字節字符;如果前三位是110,則是雙字節字符;如果前四位是1110,則是三字節字符。
字符串的長度則保存在UTF串的頭兩個字節。
DataInputStream和DataOutputStream分別有readUTF()和writeUTF()方法操作UTF編碼。
3. 當一個Unicode碼無法被轉換為ASCII碼時,產生的是”?”字符。
4. 對象IO操作
ObjectInputStream類和ObjectOutputStream類,使用readObject/writeObject方法進行讀寫。注意需要轉型。
5. Serializeable接口
可寫入對象流的對象稱為可串化的,可串化對象都繼承了java.io.Serializable接口,這是一個記號接口。
當一個對象被儲存時,對象的類名、類的簽名、實例變量的值都被儲存,但是靜態變量不會被儲存。
如果對象中含有不能被串化的實例數據域,必須將該數據域聲明為transient才能使得自身可串化。
一個對象第一次被儲存時,對象的完整內容及序列號都會被保存,之后再存儲該對象,僅僅寫入序列號。
6. 隨機文件訪問
RandomAccessFile類同時繼承了DataInput和DataOutput接口。
構造器中可以帶mode參數,”rw”表示可讀寫,”r”表示只讀。
讀寫操作都在一個稱為文件指針指示的位置進行。
length()方法返回文件的長度。
sekk()方法在文件中跳躍。