[英]Read/Write from a binary file
import java.io.*;
public class Main2 {
public static void main(String[] args) throws Exception {
DataOutputStream dos = new DataOutputStream(new FileOutputStream("Text.t"));
dos.writeByte(10101010);
DataInputStream dis = new DataInputStream(new FileInputStream("Text.t"));
int line;
System.out.println(dis.readByte());
dos.close();
dis.close();
}
}
我試圖在我創建並打印其內容的二進制文件中寫入10101010。 當我運行它時,它顯示18 ..為什么? 為什么不10101010?此外,當我使用文本板打開Text.t文件時,它包含此“垃圾”而不是10101010。
10101010%256 =18。這是您創建的整數的低字節。 文本文件帶有“垃圾”文件,因為您將其保存為二進制數據而不是文本。
如果要將數字保存為二進制字符串,則應使用FileWriter
和FileReader
而不是DataInput / OutputStream,並使用Integer.toBinaryString(int)和Integer.parseInt(str,2);
這是因為您要在其中打印二進制文件,然后讀出二進制文件。 二進制代碼10101010
對應於您所看到的箭頭,但是當它被讀出時,它是由Java處理的,因此以數字而不是ASCII(或Unicode,取決於默認編碼方式)表示。
您正在向文件Text.t
中寫入一個字節。 如果在文本編輯器中打開該文件,則將根據編輯器決定使用的任何編碼字符,看到該字節的單字符表示。
如果要查看零和八位數字的八位數字符串,則需要文本文件而不是二進制文件,並且應將數據輸出為String
。
而且,Java無法將您的數字識別為二進制文字。 值10101010
是十進制文字,表示稍大於一千萬的數字。 傳遞給dos.writeByte()
時,它將被截斷為一個字節。 如果您確實要輸出二進制表示為10101010
的單個字節,則可以將其表示為0b10101010
或十六進制文字:
dos.writeByte(0b10101010);
要么
dos.writeByte(0xAA);
以二進制形式打開文件或其他數據流並不意味着您的整數運算現在都接受具有二進制數制表示的值的輸入。 這僅表示您正在使用的數據不是人類可能讀取的數據。
DataOutputStream
上的writeByte
方法采用int
輸入並將其寫為字節。 因此,您的呼叫dos.writeByte(10101010);
寫入十進制整數值10101010
的最低有效8位。 該值恰好是0b00010010
,它是18的二進制值。
如果要在文件中表示二進制值0b10101010
,則需要寫入整數值170: dos.writeByte(170)
或dos.writeByte(0xaa)
。
您對readByte
調用也遇到了同樣的問題。 它讀取一個字節, System.out.println
將輸出表示該字節的任何字符。 如果要打印出字節的二進制值,請參閱此其他SO問題 。
由於您是在十進制整數上調用writeByte()
,因此會得到意外的結果。 WriteByte()
在1字節或8位的空間中寫入整數。 十進制數10101010與二進制數1001 1010 0010 0001 0001 0010
,其后8位為0001 0010
,即十進制數18。
要解決此問題,請讓Java將您的10101010解釋為一個二進制數字,並以0b作為前綴,以將其轉換為二進制文字 。
dos.writeByte(0b10101010);
然后,以十進制字符串形式讀回該數據,您可以使用
Byte b = (dis.readByte());
String decimalString = String.format("%8s", Integer.toBinaryString(b1 & 0xFF)).replace(' ', '0');
System.out.println(decimalString);
JoãoSilva為這個問題提供的字符串轉換
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.