gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:03:25 26 4
gpt4 key购买 nike

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

    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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com