2013-10-16 70 views
0

FileOutputStream中的write()方法接受一個int,但會截斷前三個字節並將該字節寫入流中。 如果一個文件包含ASCII值大於127的字符,並從中讀取字節,然後寫入輸出流(另一個文本文件),它將如何顯示它,因爲在Java中字節可以具有+127的最大值。FileOutputStream中的寫入方法如何截斷int類型參數

如果一個文本文件(input.text)具有字符「>」的ASCII值是155 的輸入流,輸入,從它讀取: int in= new FileInputStream("input.txt").read();//in = 155

現在其寫入另一個文本文件(輸出.TXT)

new FileOutputStream("output.txt").write(in);

這裏整數 「中的」 被截斷爲字節,這將具有對應的十進制值:-101。 它如何成功地將字符寫入文件,即使關於它的信息似乎已經丟失?

剛纔我通過寫(int)方法的Java文檔的描述去了,我觀察到的是

寫一般的合同是一個字節寫入到輸出流。要寫入的字節是參數b的八個低位。 b的24位高位爲忽略

所以,我認爲,相反的是我先前以爲(在寫的INT()被截斷,會發生,同時向下轉換的整數字節的值大於127)的24個高位僅僅忽略,只有考慮8個最低有效位。 不會截斷並轉換爲字節。 我想我是對的。

回答

3

我認爲你的困惑是由於字符集的規範通常認爲字節是無符號的,而Java將字節視爲有符號的。

實際上作爲無符號字節的155作爲有符號字節是-101。 (256 - 101 == 155)。位模式是相同的。這只是你認爲是有符號還是無符號的問題。

截斷如何編碼是特定於實現的。但是,沒有信息的損失......假設你有一個8位代碼。

+0

這意味着只有java認爲字節是有符號的,但是實際上將它寫入文件的底層系統(執行引擎)將它們視爲有符號並僅查看位模式。 此外,截斷確實發生在write()方法代碼中的某處,如下所示:「byte b =(byte)b」其中b是int作爲參數傳遞給寫入的int,可以找到。寫入參數實際上是類型轉換爲字節。 – userv

+0

是的。截斷確實發生,但它不會導致任何信息丟失......假設您只是試圖寫一個8位的代碼點。如果你想看看它發生的細節,谷歌的源代碼。 –

相關問題