2010-09-06 33 views
0

Javadoc此說:的BufferedWriter#寫(INT)的javadoc查詢

只寫oneChar整數的下兩個字節。

這對編寫已轉換爲int的非utf8編碼字符有什麼影響?

更新:

有問題的代碼從套接字接收數據,並將其寫入文件。 (很多事情發生在接收和寫入之間,所以我不能只使用我使用BufferedReader#readLine()得到的字符串。我正在使用Writer#write(char []),但這意味着我必須每次創建一個新的char數組。爲了避免每次創建一個數組,我有一個用-1填充的單個char數組(轉換爲char)。

然後我用TextUtils#getChars來填充它,如果需要的話擴大數組。對於寫入,我循環訪問數組,寫入Writer,直到char [i] ==(char)-1 == true。

+0

我不明白你的更新。 TextUtils#getChars從CharacterSequence獲取輸入。爲什麼不直接使用Writer#append(CharSequence)編寫CharacterSequence? – sleske 2010-09-08 09:56:33

+0

通常的做法是使用Reader#readLine()讀取,然後使用Writer.append進行寫入。如果因爲代碼的工作方式而無法執行此操作,則需要爲您的問題發佈一個自包含的代碼示例。否則,不可能理解你的約束並找到不同的解決方案。 – sleske 2010-09-08 09:57:10

+0

Writer#append(charsequence)在寫之前使用toString,我不想每次都創建一個新的字符串。在readline()和寫入文件之間,使用解析器解析字符串,添加格式並對字符串執行各種操作。寫作僅在由應用程序狀態和消息類型確定的某些情況下發生,因此它必須從解析器中發生。我的問題是,我可以從一個iso-8859-1編碼字符串中取出字符串,將它們轉換爲int而不會丟失任何數據。 – 2010-09-08 17:38:36

回答

0

在內部,write(int)只會將其參數設置爲char,因此write(i)等效於write((char)i)

現在在Java中,內部char只是一個整數類型,範圍爲0-65535(即16位)。鑄造INT - > char是一個「基本收縮轉換」(Java Language spec, 5.1.3)和int是一個帶符號的整數,因此:

一個簽署 整數的收縮轉換爲整數類型T簡單地 丟棄所有但n個最低階位 ,其中n是用於表示類型T.另外 至約數字 值的大小信息 一個可能發生的損失的比特 的數量,這可能會導致所得 值的符號與輸入值的符號 不同。

這就是爲什麼Javadoc說只寫入較低的兩個字節。

現在,這對於字符意味着什麼取決於你想要如何解釋int值。 Java中的char表示UTF-16中的Unicode代碼點,即由char表示的16位數字被解釋爲Unicode代碼點的數字。因此,如果每個int值都是16位代碼點的數字,那麼您很好(實際上,這僅適用於BMP中的字符;如果您在輔助平面中使用字符,則每個Unicode代碼點都將被編碼分成兩個char s)。如果是其他內容(包括多於16位或負數的代碼點或其他內容),則會產生垃圾。

什麼樣的影響,如果有的話,這對 寫非UTF8字符已 轉換爲int?

有沒有這樣的事情作爲「非utf8字符」。 UTF-8是編碼,這是一種表示Unicode代碼點的方式,因此提出的問題沒有意義。也許你可以解釋你的代碼做什麼?

+0

更新了我的問題 – 2010-09-07 22:28:31