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

时间:2014-02-14 06:20:09

标签: 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所指示的剩余字节?

任何帮助都会很棒

1 个答案:

答案 0 :(得分:1)

我不知道codinputstream是做什么的,但它可以很好地缓冲输入意味着它读取一次100个字节。

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

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

补充说明:available()通常是一个坏主意,虽然它应该特别在bytearrayinputstream上正常工作。

修改

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