如何删除缓冲的OutputStream中的缓冲数据?

时间:2011-07-29 15:14:10

标签: java buffer outputstream

可以跳过InputStream中的数据

  

in.skip(in.available());

但是如果你想用OutputStream做类似的事情我找到了

  

socket.getOutputStream()平齐();

但这不一样,flush会传输缓冲的数据而不是忽略它。

是否有可能删除缓冲数据?

由于

修改

当发送新命令(来自客户端)时,情况是客户端 - 服务器应用程序 它(尝试)确保读取的答案将与发送的最后一个命令相对应。

某些命令由(人为)事件发送,其他命令由自动线程发送。 如果命令在缓冲区上并且发送了一个新命令,那么答案将是第一个,导致去同步。

当然,同步方法加上一个名为“waitingCommand”的标志可能是更安全的方法,但由于通信不可靠,这种方法很慢(取决于超时)。这就是我要求跳过方法的原因。

6 个答案:

答案 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)

你可以做的最好“忽略”输出数据,不是先写它。