我一直在使用org.apache.commons.net。telnet连接到控制流并向摄像机发送命令。我发送一个数据流请求并打开一个新线程,该线程扫描来自摄像机传感器的图像,并将数据作为原始字节发送给我。我使用的是标准java。io流入和流出以读取。我正在向文件中写入的扩展流……只是原始字节。然而,我在读取套接字发送的数据时陷入了一个无限循环。Ainstream.read()
我已经在Wireshark中确认,所有内容都在传递给我的程序,并发送了一个FIN,但出于某种原因,JAVA没有拾取FIN并给我-1。文件的外流仍然打开,我从来没有从传感器那里得到“完整”的图像扫描。(我一直在手动杀死流并读取图像。最终目标是将此图像放入标签中,并将其用于动态偶尔的相机曝光更新。)
是否有某种方法可以检测FIN消息并告诉循环在流内读取()之外终止?
其他信息:Win 7(企业版),Netbeans IDE
>
你真的认为你的流读代码很特别,所以你不能发布它?我对此表示怀疑。
<代码>。available()不是对流结束的测试。它只返回您可以安全读取的字节数,而不会被阻止等待传入数据。
图像数据结束后,你从流中得到了什么?
这是InputStream
使用的示例,我100%确定它是有效的并且正确处理eof
-s、异常和流关闭等:
static final int BUFFER_SIZE = 1024 * 32;
public static ByteBuffer buffer(InputStream stream) throws IOException {
// try (<resourse>) to properly handle 'stream.close()`
try (BufferedInputStream reader = new BufferedInputStream(stream)) {
byte[] buffer = new byte[BUFFER_SIZE];
ByteBuffer result = ByteBuffer.allocate(BUFFER_SIZE);
int totalReaded = 0, readed;
while ((readed = reader.read(buffer)) >= 0) {
if (readed > result.remaining()) {
// well, we've exceeded capacity of given buffer, make it grow
ByteBuffer t = result;
result = (ByteBuffer) ByteBuffer.allocate((int)((totalReaded + readed) * 1.3));
result.put(t.array(), 0, totalReaded);
}
totalReaded += readed;
result.put(buffer, 0, readed);
}
return ByteBuffer.wrap(result.array(), 0, totalReaded);
}
}
Ainstream.read()
当然可以。它丢弃了一个字节,而且它首先不是一个有效的测试。您的读取循环应该如下所示:
int ch;
while ((ch = instream.read()) != -1)
{
// ... Cast ch to a byte and use it somehow ...
}
或这个:
int count;
byte[] buffer = new byte[8192];
while ((count = instream.read(buffer)) > 0)
{
// ...
// for example:
out.write(buffer, 0, count);
}
问题内容: 基本上,这是在尝试回答另一个问题时出现的。假设此代码: 我了解以下事实:这是 无序的无限流 ,要使其完成,必须进行短路操作(在这种情况下)。我也了解,在达到该限制之前,可以随意调用Stream实现多次。 在java-8下运行此命令,将始终打印(可能不总是打印,但在我的机器上是这样)。 相反,在java-10下运行this很少超过。所以我的问题是内部发生了什么变化,从而使短路发生得更好了
我试图理解为什么下面的Java程序给出了< code>OutOfMemoryError,而对应的程序却没有< code >。parallel()没有。 我有两个问题: > 该程序的预期输出是什么? 不带<代码>。parallel()看起来这只是输出< code>sum(1 2 3...)这意味着它只是“停留”在平面图中的第一个流,这是有意义的。 对于并行,我不知道是否有预期的行为,但我的猜测是它以
有时,在处理流的两个步骤之间对流中的每个元素进行“处理”(例如打印)会很方便,例如调试。 一个简单的例子可能是这样的,不幸的是,这不起作用,因为消耗流: 如何做到这一点?
我试图从多个内存流生成一个PDF文件,但在确定将2个PDF MemoryStream合并为一个PDF MemoryStream的正确方法时遇到了很多困难,该PDF MemoryStream包含来自两个源PDF MemoryStream的所有页面。这看起来很简单,我认为下面的代码设置正确,但生成的PDF内存流并不包含这两个文件的组合。 我很难确定将2个PDF MemoryStream合并为一个PDF
我有一个相当复杂的过程,需要几个层次的嵌套for循环。 只针对一组特定的条件执行操作。换句话说:
我在使用SharpZipLib的GZipInputStream编写未压缩的GZIP流时遇到问题。我似乎只能获得256字节的数据,其余的数据没有写入并保留为零。已检查压缩流(compressedSection),所有数据都在那里(1500字节)。解压缩过程的片段如下: 因此,在这段代码中: 1) 压缩的部分被传入,准备解压缩。 2) 未压缩输出的预期大小(以2字节小endian值的形式存储在文件头中