我從一個InputStreamReader開始,但是這緩衝了它的輸入,從輸入流中讀取更多的數據(正如Java文檔中提到的那樣)。鑽研源代碼(Java版「1.7.0_147-IcedTea項目」),我到了sun.nio.cs.StreamDecoder類,它包含的評論:是否可以從輸入流中讀取單個字符?
// In order to handle surrogates properly we must never try to produce
// fewer than two characters at a time. If we're only asked to return one
// character then the other is saved here to be returned later.
所以我猜這個問題就變成了「是這樣的真的,如果是的話,爲什麼?「從對JLS所需的6個字符集的理解(非常基本!)中,始終可以確定讀取單個字符所需的確切字節數,因此不需要預讀。
背景是我有一個二進制文件包含一堆數據與不同的編碼(數字,字符串,單字節標記等)。基本格式是一組重複的字節標記(表示數據類型),如果需要該類型,則選擇數據。包含字符數據的兩種類型是以空字符結尾的字符串和前一個2字節長度的字符串。因此,對於空終止字符串我想這樣的事情會做的伎倆:
String readStringWithNull(InputStream in) throws IOException {
StringWriter sw = new StringWriter();
InputStreamReader isr = new InputStreamReader(in, "UTF-16LE");
for (int i; (i = isr.read()) > 0;) {
sw.write(i);
}
return sw.toString();
}
但使用InputStreamReader從緩存預讀取,對基地的InputStream所以隨後的讀操作丟失的數據。對於我的特殊情況,我知道所有字符都是UTF-16LE BMP(UCS-2LE),所以我只是編碼,但我仍然對上面的一般情況感興趣。
此外,我見過InputStreamReader buffering issue這是相似的,但似乎回答這個具體問題。
乾杯,
謝謝,但看起來像'DataInputStream'返回一個大端字符,在那裏我的具體數據是little-endian。 – Barney 2012-04-19 01:23:21