2013-06-20 112 views
0

我有一個包含UTF-8數據的文件。該文件沒有任何BOM(字節順序標記),也沒有任何長度/大小信息作爲每個unicode字/行的前綴。Java:從UTF-8文件讀取字節

我想從給定的偏移量和長度讀取字節(是字節!)。如果API具有查找,讀取字節或從偏移量讀取字節等功能,這將非常有幫助。

示例內容 - 「100°Info」,對於此內容長度爲9,如果我請求讀取9個字節,則應該讀取所​​有內容。目前它只能讀取8.它看起來像API將Unicode字符視爲2個字符。

如何正確讀取內容?同樣使用哪個API?

+0

UTF內容 - 「100°信息」,ANSI編碼(文件內容) - 「100°信息」。如果我使用RandomAccessFile,我不能以UTF-8 CharSet模式讀取它! – Muthuveerappan

回答

2

但是,編碼爲UTF-8時,度數的Unicode字符實際上是兩個字節。學位符號由字節c2 b0表示。如果你真的想在文件中的特定偏移處讀取字節,你可以在Java中使用RandomAccessFile,但是我懷疑這是你真正想要的。

可能最簡單的方法是使用FileReader並讀取大小爲9的char數組,或者只讀9個字符到更大的char數組中。例如:

try (Reader reader = new InputStreamReader(new FileInputStream(filename), "UTF-8")) { 
    char[] buffer = new char[1024]; 
    reader.read(buffer, 0, 9); 
} 
0

我有一種感覺,你在混淆字符和字節。文本100° Info有九個字符,但由於度數符號存儲爲兩個字節,所以這將是十個字節。如果你讀了9個字節,你會錯過Infoo,但是這仍然會解析爲字符串,因爲它是單字節字符。

0

您當然可以將內容讀入字符串,然後使用String.getBytes(「UTF8」)獲取給定字符串的字節。這將返回您的概述情況下的所有9個字節。

+0

在這種情況下會有10個字節。 –

+0

David是正確的:在十進制中:[49,48,48,-62,-80,32,73,110,102,111] – Broonix