【问题标题】:Opening InputStreamReader in the middle of UTF-8 stream在 UTF-8 流中间打开 InputStreamReader
【发布时间】:2015-06-23 16:11:19
【问题描述】:

我正在使用可搜索的 InputStream,它在特定位置将流返回给我。流中的底层数据使用 UTF-8 编码。我想使用 inputStreamReader 打开这个流并一次读取一个字符。

这是我的代码 sn-p

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

问题在于,如果 position-1 可能指向多字节 UTF-8 序列的中间。如何检测以确保它从新的 UTF-8 编码序列开始?提前致谢。

【问题讨论】:

  • 那么position 意味着是什么?你从哪里获得价值?拥有一个您信任的值似乎很奇怪,但不知道它位于角色的开头。 (诚​​然,有很多方法可以做你想做的事......)
  • @Jon :底层数据流包含序列化的复杂对象。可变位置用于拆分此缓冲区并以较小的块进行处理。但拆分可能并不完全位于对象边界处。我通过 RPC 从另一个进程获取值。我无法控制如何设置位置。

标签: java encoding utf-8


【解决方案1】:

假设您可以随时重新定位流,您可以简单地读取最高两位为“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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 2013-12-16
    • 2013-12-15
    相关资源
    最近更新 更多