【问题标题】:How to delete buffered data in a buffered OutputStream?如何删除缓冲输出流中的缓冲数据?
【发布时间】:2011-07-29 15:14:10
【问题描述】:

可以跳过 InputStream 中的数据

in.skip(in.available());

但如果你想用我发现的 OutputStream 做类似的事情

socket.getOutputStream().flush();

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

有没有可能删除缓冲数据?

谢谢

编辑

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

一些命令由(人为触发的)事件发送,而另一些则由自动线程发送。 如果一个命令在缓冲区中并且发送了一个新命令,那么答案将是第一个命令,导致不同步。

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

【问题讨论】:

    标签: java buffer outputstream


    【解决方案1】:

    您无法删除本可以发送的数据。您可以将数据写入内存中的 OutputStream,例如 ByteArrayOutputStream,然后只复制您想要的部分。

    【讨论】:

      【解决方案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】:

      “跳过”输出数据是什么意思?

      一旦数据在缓冲区中,就无法取回或删除它。我建议在将数据写入OutputStream 之前检查是否要跳过数据。要么,要么拥有你自己的二级缓冲区,你可以随意修改。

      【讨论】:

      • 辅助缓冲区似乎是答案
      【解决方案4】:

      这个问题没有任何意义。丢弃待处理的请求只会让您的应用程序协议问题变得更糟。等待对已删除请求的响应的人会发生什么?该请求应该实现的功能发生了什么变化?你需要从另一个角度重新考虑这一切。如果您有一个到正在为此客户端执行请求/响应事务的服务器的单一连接,则该协议已经是顺序的。您将不得不同步例如写入和刷新请求并读取响应时的套接字,但是您不会因此而失去任何性能,因为无论如何另一端的处理都是顺序化的。您也不需要“waitingCommand”标志,只需同步即可。

      【讨论】:

      • 我同意,反正我给+1,因为你理解这个问题,但是通道根本不可靠,有很多数据丢失和重新连接,所以为了尽量减少对用户的影响,我会添加第二种方法(不是完全不同步,而是优先),首先丢弃自动命令来解决最近的人工订单,阻止每次传输超时将变得非常慢,其次,使用“ waitngCommand”我的意思是“只是同步”,该标志只是为了避免“虚假唤醒”总是建议同步检查变量。谢谢
      • @Hernán Eche 这是一个什么样的频道?也许你应该使用两个渠道,一个用于自动化的东西,一个用于用户的东西?而且我仍然没有得到关于布尔值的这些东西。你需要一个带有 wait()/notify() 的布尔值,而不是同步(synchronized() 关键字)。
      • 您好,wait() 和 notify() 并不是真正可分离的 synchronized 关键字,它们一起工作。该频道是GSM/GPRS网络(丑陋的频道)。关于布尔值(不需要是布尔值)看这个vladimir_prus.blogspot.com/2005/07/spurious-wakeups.htmldevguli.com/blog/eng/spurious-wakeup问候!
      • @Hernán Eche 我重复一遍。等待/通知需要布尔值。没有它们就不需要它。您完全可以在不使用等待/通知的情况下完美同步,这就是我针对这种情况的建议。
      【解决方案5】:

      由于您正在控制写入 OutputStream 的数据,所以不要编写您不需要的部分。约定的OutputStream,并不能保证数据的真正写入时间,所以有skip方法意义不大。

      【讨论】:

      • 查看编辑,我无法完全控制写入的数据,否则通信会变慢
      【解决方案6】:

      要“忽略”输出数据,最好的办法就是不要一开始就写出来。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-08
        • 2013-01-11
        • 1970-01-01
        相关资源
        最近更新 更多