【发布时间】:2017-04-02 17:48:52
【问题描述】:
我的目标是将字节流从套接字读取到文件中,然后稍后将其作为我的应用程序的测试工具进行回放。在将字节写入磁盘的某个地方,一个字节会被错误地写入,似乎是随机的。
我的作者是这样的:
blobWriter = new BufferedOutputStream(new FileOutputStream(blobFileName));
blobChannel = Channels.newChannel(blobWriter);
我正在使用blobChannel,这样我就可以直接从ByteBuffer 写信。在每次读取套接字时,我只需将缓冲区传递给写入器:
if (key.isReadable()) {
final int bytesRead= socketChannel.read(readBuffer);
if(bytesRead == -1)
{
logger.warn("no bytes to read");
break;
}
readBuffer.flip();
blobChannel.write(readBuffer);
...
<continue to process data>
}
当提要处于活动状态时,程序会处理对记录的读取,并且它们不会损坏。假设每条消息,它输出一个包含 7 个字段的元组。例如,其中之一是这样的:
(tupleid=0,msgType=110,feedId=225,venueId=30,orderId=160,symbol="CHF.NOK.SPOT",venueTime=44417979)
当我没有与市场建立实时连接,而是将应用程序连接到从磁盘播放相同数据的读取器时,处理后的输出会变得混乱:
(tupleid=0,msgType=110,feedId=225,venueId=30,orderId=160,symbol="CHF.-�ûnX",venueTime=44417979)
注意损坏的符号。
最奇怪的是它会处理数千条具有相同符号和其他字段的消息,但随后莫名其妙地一条消息被破坏了。并不总是符号字段不正确,有时 orderId 错误等等......
我怀疑blobWriter 有时会写错。我的操作系统(Windows 7)可以做一些时髦的事情吗?我检查了notepad++ 中保存到磁盘的字节流,确实它显示了不正确的字节,所以错误必须在文件编写器中,而不是在我的播放机制中。此外,如果主应用程序本身有问题,它应该会误读实时提要上的字节;它没有。
有谁知道可能出了什么问题?
【问题讨论】:
-
输出显示在哪里?
-
具体是哪个输出?
-
你提到的'处理后的输出'。
-
我展示的两个元组记录是处理输出的一个例子。第一个,具有正确的字段,是在实时市场上完成处理时。第二个,有一个坏字节,是一个处理从保存到磁盘的数据的例子。我在想 writeBufferChannel 可能是问题所在,因为服务器处于非阻塞模式并且 javadoc 提到这可能是一个问题
-
EJP,这真的是重复的吗,因为我在发布之前阅读了那个问题?如果是这样,我会改变我的作家以确保正确的行为?顺便说一句,我的频道似乎正在写入更多字节,而我的读者实际上是从缓冲区读取的。
标签: java sockets io buffer nio