Java writeDelimitedTo/parseDelimitedFrom似乎正在丢失数据

Java writeDelimitedTo/parseDelimitedFrom似乎正在丢失数据,java,protocol-buffers,Java,Protocol Buffers,我试图使用协议缓冲区来记录一些市场数据。每次从市场收到报价通知时,我都会将此报价转换为协议缓冲区对象。然后我叫“WritedLimitedTo” 我的录音机示例: try { writeLock.lock(); LimitOrder serializableQuote = ... LimitOrderTransport gpbQuoteRaw = serializableQuote.serialize(); LimitOrderTransport gpbQuot

我试图使用协议缓冲区来记录一些市场数据。每次从市场收到报价通知时,我都会将此报价转换为协议缓冲区对象。然后我叫“WritedLimitedTo”

我的录音机示例:

try {
    writeLock.lock();

    LimitOrder serializableQuote = ...
    LimitOrderTransport gpbQuoteRaw = serializableQuote.serialize();
    LimitOrderTransport gpbQuote = LimitOrderTransport.newBuilder(gpbQuoteRaw).build();
    gpbQuote.writeDelimitedTo(fileStream);

    csvWriter1.println(gpbQuote.getIdNumber() + DELIMITER+ gpbQuote.getSymbol() + ...);

} finally {
    writeLock.unlock();
}
锁定的原因是来自不同市场的报价由不同的线程处理,所以我试图简化并“序列化”文件的日志记录

读取结果文件的代码:

FileInputStream stream = new FileInputStream(pathToFile);
PrintWriter writer = new PrintWriter("quoteStream6-compare.csv", "UTF-8");

while(LimitOrderTransport.newBuilder().mergeDelimitedFrom(stream)) {
   LimitOrderTransport gpbQuote= LimitOrderTransport.parseDelimitedFrom(stream);

   csvWriter2.println(gpbQuote.getIdNumber()+DELIMITER+ gpbQuote.getSymbol() ...);

}
当我运行记录器时,我得到一个二进制文件,它的大小似乎在增长。当我使用我的阅读器读取文件时,我似乎也会得到大量的引号。它们都是不同的,看起来是正确的

问题是:许多引用似乎“丢失”——当我的读者从文件中读取时,这些引用并不存在

我用csvWriter1和csvWriter2做了一个实验。在我的writer中,我写出一个csv文件,然后在我的reader中,我使用MyProtoBufs文件作为源编写第二个cvs文件

理论是他们应该匹配。他们不匹配。原始csv文件中包含的引号比我通过读取protobufs记录数据生成的csv多得多

有什么好处?我是否正确使用writedLimitedTo/parsedDelimitedFrom

谢谢

您的问题在于:

while(LimitOrderTransport.newBuilder().mergeDelimitedFrom(stream)) {
  LimitOrderTransport gpbQuote= LimitOrderTransport.parseDelimitedFrom(stream);
第一行构造了一个新的LimitOrderTransport.Builder,并使用它来解析来自流的消息。然后,该构建器被丢弃

第二行将来自同一流的新消息解析为新的生成器

因此,您将丢弃所有其他邮件

改为这样做:

while (true) {
  LimitOrderTransport gpbQuote = LimitOrderTransport.parseDelimitedFrom(stream);
  if (gpbQuote == null) break;  // EOF

非常感谢。我知道那个圈有点奇怪。我在寻找某种“hasNext”功能,但我肯定错了。无论哪种方式都解决了我的问题。