【问题标题】:Is protocol buffers optimized to use java nio for file IO?协议缓冲区是否针对使用 java nio 进行文件 IO 进行了优化?
【发布时间】:2012-07-04 00:48:48
【问题描述】:

我正在使用协议缓冲区,想知道是否:

mergeDelimitedFrom(FileInputStream fis)

方法是否被优化为使用java nio?我真的不想去 src 找出来……但也许我会的。我觉得它应该或可以选择同时使用两者。我猜它不是。如果不是 - 我猜你必须自己解析字节并手动处理分隔符如果你想要 nio?

现在对 nio api 不是很有信心,但你不要只是打电话:

 getChannel()

在 FileInputStream 上使用 nio,所以假设可以使用 nio,因为向 mergeDelimitedFrom 方法提供了 FileInputStream?

相关帖子,但更针对网络 IO:

Using Google Protocol Buffers with Java NIO?

【问题讨论】:

  • “我真的不想去 src 寻找” - 似乎有点懒惰。 :-\
  • 是的,想在谷歌搜索结果中找到答案。
  • @GregKopff 也希望就其他人是否也想要这个问题进行一些讨论,即 pb 中的 nio 支持。

标签: java protocol-buffers nio


【解决方案1】:

我原以为这段代码不是生成代码的一部分,但我猜它是...

MergeDelimitedFrom 在下面调用 CodedInputStream.readRawVarint32:

public static int readRawVarint32(
  final int firstByte, final InputStream input) throws IOException {
if ((firstByte & 0x80) == 0) {
  return firstByte;
}

int result = firstByte & 0x7f;
int offset = 7;
for (; offset < 32; offset += 7) {
  final int b = input.read();
  if (b == -1) {
    throw InvalidProtocolBufferException.truncatedMessage();
  }
  result |= (b & 0x7f) << offset;
  if ((b & 0x80) == 0) {
    return result;
  }
}
// Keep reading up to 64 bits.
for (; offset < 64; offset += 7) {
  final int b = input.read();
  if (b == -1) {
    throw InvalidProtocolBufferException.truncatedMessage();
  }
  if ((b & 0x80) == 0) {
    return result;
  }
}
throw InvalidProtocolBufferException.malformedVarint();

}

看起来像普通的旧 java.io。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多