可以跳过InputStream中的数据
in.skip(in.available());
但是如果你想用OutputStream做类似的事情我找到了
socket.getOutputStream()平齐();
但这不一样,flush会传输缓冲的数据而不是忽略它。
是否有可能删除缓冲数据?
由于
修改
当发送新命令(来自客户端)时,情况是客户端 - 服务器应用程序 它(尝试)确保读取的答案将与发送的最后一个命令相对应。
某些命令由(人为)事件发送,其他命令由自动线程发送。 如果命令在缓冲区上并且发送了一个新命令,那么答案将是第一个,导致去同步。
当然,同步方法加上一个名为“waitingCommand”的标志可能是更安全的方法,但由于通信不可靠,这种方法很慢(取决于超时)。这就是我要求跳过方法的原因。
答案 0 :(得分:3)
您无法删除可能已发送的数据。您可以将数据写入内存中的OutputStream,如ByteArrayOutputStream,并仅复制所需的部分。
答案 1 :(得分:2)
“跳过”输出数据是什么意思?
一旦数据在缓冲区中,就无法将其恢复或删除。我建议您检查是否要跳过之前的数据,然后将其写入OutputStream
。要么是这样,要么拥有自己的辅助缓冲区,您可以随意修改。
答案 2 :(得分:2)
我不确定它是否有意义,但你可以试试:
class MyBufferedOutputStream extends java.io.BufferedOutputStream {
public MyBufferedOutputStream(OutputStream out) {
super(out);
}
/** throw away everything in a buffer without writing it */
public synchronized void skip() {
count = 0;
}
}
答案 3 :(得分:1)
这个问题没有任何意义。丢弃待处理的请求只会使您的应用程序协议问题变得更糟。等待对已删除请求的响应的人会发生什么?该请求应该实现的功能发生了什么?您需要从另一个角度重新考虑所有这些。如果您与正在为此客户端执行请求/响应事务的服务器建立单一连接,则该协议已经是顺序的。您必须同步,例如写作时的插座&刷新请求并读取响应,但是你没有失去任何性能,因为无论如何都要对另一端的处理进行顺序化。你也不需要'waitingCommand'标志,只需要同步。
答案 4 :(得分:0)
由于您正在控制写入OutputStream的数据,因此不要编写您不需要的部分。按合同的OutputStream,不能确保何时实际写入数据,因此使用skip方法没有多大意义。
答案 5 :(得分:0)
你可以做的最好“忽略”输出数据,不是先写它。