2015-06-23 49 views
1

我正在使用可搜索的InputStream,它將流返回給特定位置的我。流中的基礎數據使用UTF-8編碼。我想用inputStreamReader打開這個流並一次讀一個字符。在UTF-8流中打開InputStreamReader

這裏是我的代碼片斷

inputStream.seek(position-1); 
InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8"); 

的問題是,如果位置-1可能是指向多字節UTF-8序列的中間。我怎樣才能檢測到確保它從一個新的UTF-8編碼序列開始?提前致謝。

+2

那麼'position' *意思是什麼?你從哪裏得到價值?擁有你信任的價值似乎很奇怪,但不知道它是在角色的開始。 (無論如何,有辦法做你想做的事情......) –

+0

@Jon:底層數據流包含序列化的複雜對象。可變位置用於分割此緩衝區並以較小的塊進行處理。但是分裂可能不完全在物體邊界。我通過RPC從另一個進程獲取值。我無法控制位置如何設置。 – ToyElephant

回答

2

假設您可以隨時重新定位數據流,只需在最高兩位爲「10」的情況下讀取字節即可。所以像這樣:

// InputStream doesn't actually have a seek method, but I'll assume you're using 
// a subclass which does... 
inputStream.seek(position); 
while (true) { 
    int nextByte = inputStream.read(); 
    if (nextByte == -1 || (nextByte & 0xc0) != 0xc0) { 
     break; 
    } 
    position++; 
} 
// Undo the last read, effectively 
inputStream.seek(position); 
InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);