java流与文件——读写二进制数据(DataOutput + DataInput)
【0】README
0.1) 本文描述轉自 core java volume 2, 旨在理解 java流與文件——讀寫二進制數據(DataOutput + DataInput)的相關知識;
0.2) for complete my diy code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter1/BinaryIO.java
【1】DataOutput
1.0)DataOutput 接口定義 了 下面用于以二進制格式寫數組, 字符, boolean 和 字符串的方法:
writeChars, writeByte, writeInt, writeShort, writeLong, writeFloat, writeDouble, writeChar, writeBoolean, writeUTF;
1.1)例如, writeInt 總是將一個整數寫出為 4字節的二進制數量值;
1.2)不管它有多少位, writeDouble 總是將一個double值寫出為 8 字節的二進制數量值;
1.3)這樣產生的結果并非人可閱讀的, 但是對于給定類型的每個值, 所需的空間總是相同的, 而且將其讀回也比解析文本要更快;(干貨——解析二進制數據比解析文本數據要更快)
Attention)
- A1)在 java中,所有的值都按照 高位在前的模式寫出, 不管使用何種處理器, 這使得java 數據文件獨立于平臺;
- A2) 如 1234(10)=4D2(16): 高位在前順序為 00 00 04 D2 ; 而 低位在前順序為 D2 04 00 00;
【2】 writeUTF方法:
2.1)writeUTF方法 使用修訂版的8位 Unicode轉換格式寫出字符串;這種方式與直接使用標準的UTF-8 編碼方式不同, 其中, Unicode碼元序列首先用 UTF-16 表示, 其結果之后使用 UTF-8 規則進行編碼;
2.2)修訂后的 編碼方式對于編碼大于 0xFFFF 的字符的處理有所不同, 這是為了向后兼容在Unicode 還沒有超過16 位時構建的虛擬機;
Attention) (干貨——如何使用 writeChars 和 writeUTF 方法)
- A1)因為沒有其他方法會使用 UTF-8 的這種修訂, 所以你應該只在寫出用于 java 虛擬機的字符串時才使用 writeUTF方法;例如,當需要編寫一個生產字節碼序列的程序時;
- A2)而對于其他場合, 都應該使用 writeChars 方法;
【3】DataInput方法: 為了讀回數據, 可以使用在 DataInput 接口中定義的下列方法:
- readInt, readShort, readLong, readFloat, readDouble, readChar, readBoolean, readUTF;
3.1)讀入二進制數據: DataInputStream 類實現了DataInput接口, 為了從文件中讀取二進制數據, 可以將 DataInputStream與某個字節源進行組合, 如 FileInputStream:
DataInputStream dis = new DataInputStream(new FileInputStream(“employee.dat”));
3.2)寫出二進制數據: DataOutputStream dos = new DataOutputStream(new FileOutputStream(“employee.dat”));
【4】隨機訪問文件(RandomAccessFile 同時實現了 DataInput 和 DataOutput 接口)
- Attention) for detailed RandomAccessFile, please visit http://blog.csdn.net/PacosonSWJTU/article/details/50513407
4.0)RandomAccessFile 類 : 可以 在文件中任何位置查找或寫入數據;(干貨——這是引入 RandomAccessFile 類的原因)
4.1) RandomAccessFile類可以在文件中的任何位置查找或讀寫數據;
4.2)磁盤文件都是可以隨機訪問的, 但是從網絡而來的數據流卻不是;
4.3)打開一個隨機訪問文件,只用于讀入或同時用于讀寫;
4.4)seek 方法:隨機訪問文件有一個表示下一個將被讀入或寫出的字節所處的位置的文件指針, seek 方法可以將這個文件指針設置到 文件中任意字節 的位置;
- 4.4.1)假設想讀入第三條數據:
long n = 3;
in.seek((n-1) * RECORD_SIZE); - 4.4.2)如果你希望修改數據,請切記將文件指針重置到開始處:
in.seek((n-1) * RECORD_SIZE);
e.writeData(out); - 4.4.3)length 方法:確定文件大小,使用 length 方法;
4.5) 整數和浮點值在二進制格式中都有固定的尺寸, 但處理 字符串就有些麻煩了, 我們提供了 兩個助手方法來讀寫具有固定尺寸的字符串:
- writeFixedString 方法: 寫出從字符串開頭開始的指定數量的碼元;
- readFixedString 方法: 從輸入流中讀入字符, 直至讀入size 個碼元, 或者直至到具有0值的字符值, 然后跳過輸入字段中剩余的 0值;為了提高效率,使用 StringBuilder 類來讀入字符串;
總結
以上是生活随笔為你收集整理的java流与文件——读写二进制数据(DataOutput + DataInput)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓机内存卡安装(安卓机内存卡)
- 下一篇: java流与文件——ZIP文档