0

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

mergeDelimitedFrom(FileInputStream fis)

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

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

 getChannel()

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

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

在 Java NIO 中使用 Google 协议缓冲区?

4

1 回答 1

-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。

于 2012-07-04T02:20:54.750 回答