为什么 CodedInputStream.readRawVarint64() 正在从底层流中读取所有字节



下面是演示问题的示例代码。

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    CodedOutputStream cos = CodedOutputStream.newInstance(bos);
    cos.writeRawVarint64(25);
    cos.flush();
    bos.write("something else".getBytes());
    System.out.println("size(bos) = " + bos.size());  // This gives 15
    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
    CodedInputStream cis  = CodedInputStream.newInstance(bis);
    System.out.println("size(bis) = " + bis.available()); // This gives 15
    long l = cis.readRawVarint64();   
    System.out.println(cis.getTotalBytesRead()); // This gives 1, which is correct
    System.out.println("Raw varint64 = " + l);  // This gives 25, which is correct
    System.out.println("size(bis) = " + bis.available()); // This now gives 0!!

我要做的就是对一个 64 位整数进行编码,并向有效负载添加更多数据。我可以正确读取编码数据。但出于某种原因,它会在那之后清除底层流。有人知道为什么会这样吗?如何从流中读取varint并读取varint指示的剩余字节?

任何帮助都会很棒

我不知道

codedinputstream做了什么,但它可以很好地缓冲输入,这意味着它一次读取100字节。

无论哪种方式,您都不应该将输入流 B 包裹在输入流 A 周围并继续从 A 读取,特别是因为您不知道 B 的作用。

例如,也许 B 必须在数据中向前看以形成一些结论,或者它使用缓冲或......

附加说明:available() 通常是一个坏主意,尽管它应该在字节数组输入流上正常工作。

编辑

结论:只需继续从编码输入流读取,不要尝试从底层读取。

相关内容

  • 没有找到相关文章

最新更新