3

我讀過Java在內部使用UTF-16編碼。即我明白,如果我喜歡:String var =「जनमत」;那麼「जनमत」將在內部以UTF-16編碼。所以,如果我傾倒這個變量的一些文件,如下面:ObjectOutputStream的writeObject方法使用什麼字符編碼?

fileOut = new FileOutputStream("output.xyz"); 
out = new ObjectOutputStream(fileOut); 
out.writeObject(var); 

將字符串「जनमत」的編碼文件「output.xyz」的是UTF-16?另外,如果我想通過ObjectInputStream從文件「output.xyz」中讀取,我將能夠獲得變量的UTF-16表示嗎?

謝謝。

+0

我不認爲你應該關心編碼中使用的`ObjectOutputStream`。如果您要在其他地方使用生成的文件,請不要使用ObjectOutputStream。如果不是,你不必考慮它。 – khachik 2010-12-08 17:37:04

回答

1

關閉:它是不完全的UTF-16,但像UCS-2;但是對於大多數字符(和2個字符的序列,即對於一些很少使用的碼點,4字節)使用2字節的方式。

ObjectOutputStream使用了一種稱爲UTF-8的修改UTF-8,但其中零字符表示爲2字節的順序,由於編碼的唯一性限制,這不符合UTF-8的合法性,但那種自然解碼回值0

但是你真正問的是「它的工作原理,讓我寫一個字符串,讀一個字符串」 - 而問題的答案是肯定的。寫入字節時JDK會進行正確的編碼,並在讀取時進行解碼。

對於它的價值,您正在使用「writeUTF()」方法對字符串進行更好的,因爲我覺得最終的輸出是位更加緊湊。但是「writeObject()」也可以工作,只需要更多的元數據。

4

所以,如果我把這個變量轉儲到某個文件中......文件「output.xyz」中字符串「जनमत」的編碼是UTF-16嗎?

您的文件中字符串的編碼會以什麼格式ObjectOutputStream希望把它。你應該把它看作是隻能由ObjectInputStream讀取的黑匣子。 (嚴重 - 即使格式是IIRC well-documented,如果你與其他一些工具來讀它,你應該自己連載的對象作爲XML或JSON或什麼的。)

後來,如果我想通過ObjectInputStream從文件「output.xyz」中讀取,我將能夠獲得變量的UTF-16表示嗎?

如果您使用ObjectInputStream讀取該文件,您會收到原始對象的副本。這將包括一個java.lang.String,這是字符的只是流(而不是字節) - 從中​​,如果你通過getBytes()方法希望你能得到的UTF-16表示(雖然我懷疑你實際上並不需要)。


總之,不要太擔心序列化的內部細節。如果你需要需要知道發生了什麼,自己創建文件;如果你只是好奇,相信JVM做正確的事情。

0

我想補充這一點,ObjectOutputStream.writeString()將determing給定的字符串的UTF長度,它在「標準」 UTF寫或「長」 UTF格式,其中「長」在javadoc中陳述

「長」UTF格式與標準UTF的 相同,只是它使用字節標頭(而不是標準的2 字節)傳達長度的UTF編碼 長度。

我得到這個從代碼...

private void writeString(String str, boolean unshared) throws IOException { 
    handles.assign(unshared ? null : str); 
    long utflen = bout.getUTFLength(str); 
    if (utflen <= 0xFFFF) { 
     bout.writeByte(TC_STRING); 
     bout.writeUTF(str, utflen); 
    } else { 
     bout.writeByte(TC_LONGSTRING); 
     bout.writeLongUTF(str, utflen); 
    } 
} 

writeObject(Object obj)他們做了檢查

if (obj instanceof String) { 
    writeString((String) obj, unshared); 
} 
相關問題