以下是演示此问题的示例代码。
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
所指示的剩余字节?
任何帮助都会很棒
答案 0 :(得分:1)
我不知道codinputstream是做什么的,但它可以很好地缓冲输入意味着它读取一次100个字节。
无论哪种方式,您都不应该将输入流B包裹在输入流A周围并继续从A继续读取,因为您不知道B的作用。
例如,B可能必须向前看数据以形成一些结论,或者它使用缓冲或...
补充说明:available()通常是一个坏主意,虽然它应该特别在bytearrayinputstream上正常工作。
修改强>:
总之:只需继续读取编码输入流,不要尝试从底层读取。