下面是演示问题的示例代码。
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() 通常是一个坏主意,尽管它应该在字节数组输入流上正常工作。
编辑:
结论:只需继续从编码输入流读取,不要尝试从底层读取。