2015-06-23 47 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);