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

标签 java stream protocol-buffers

这是演示该问题的示例代码。

    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() 通常是一个坏主意,尽管它应该在 bytearrayinputstream 上正确工作。

编辑:

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

关于java - 为什么 CodedInputStream.readRawVarint64() 正在从底层流中读取所有字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21772177/

相关文章:

java - 如何使用xpath dom java获取子节点的节点列表?

java - 无法引用主 android 库

scala - Stream 中的 isEmpty 方法是否评估整个 Stream?

iphone - Wowza:需要将 rtp-live 流式传输到 iPhone

python - Escape Python中的保留关键字[Protocol Buffer自动生成的类]

java - 使用 PrettyTime 库格式化时间

java - 有什么方法可以从本地计算机(本地服务器)读取数据库文件并将其复制到android中的 Assets 文件夹中?

c# - 如何将两个 System.IO.Stream 实例连接成一个?

hadoop - 我们如何为 HDFS(Hadoop 分布式文件系统)开发代理

javascript - axios请求抛出未知错误