【问题标题】:Implementation of Java OutputStream flush() methodJava OutputStream flush() 方法的实现
【发布时间】:2014-05-07 20:26:46
【问题描述】:

我有一个写线程,使用OutputStream,我想实现一个flush()方法。
As mentioned in the API

OutputStream 的 flush 方法什么都不做
并应在需要时实施。

我有以下线程,我有点困惑我应该如何覆盖flush()

    private class ConnectedThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;

        public ConnectedThread(BluetoothSocket socket) {
            mmSocket = socket;
            InputStream tmpIn = null;
            OutputStream tmpOut = null;

            // Get the BluetoothSocket input and output streams
            try {
                    tmpIn = socket.getInputStream();
                    tmpOut = socket.getOutputStream();
            } catch (IOException e) {

            }

            mmInStream = tmpIn;
            mmOutStream = tmpOut;
         }


        public void write(byte[] buffer) {

            try {
                mmOutStream.write(buffer);
               // does nothing
                mmOutStream.flush();
            } catch (IOException e) {

            }

        }

谢谢!

【问题讨论】:

  • 文档说OutputStream(顺便说一下abstract)的基本实现什么都不做;这并不意味着类继承这个基类使用这个基实现。
  • 为什么要覆盖OutputStreamflush()方法?只需使用PrintWriterBufferedWriter 就可以了很多 impl。
  • 既然你想修改一个类的行为(实现flush())你需要扩展它。您可以先创建自己的类来扩展某种类型的OutputStream,然后您应该能够覆盖和实现flush()
  • 确实如此。抽象类扮演着模板模式的角色,具体类来决定如何填充flush。

标签: java flush


【解决方案1】:

您的问题是关于“实现”flush(),但您的代码没有实现输出流。我猜你要么想问“使用”flush(),要么你错过了getOutputStream()返回一个OutputStream的实现,它很可能有一个工作的flush()(在某些情况下它是一个空实现,因为没有特别的如果流没有缓冲,则需要处理)。

我不确定您使用的是什么 BluetoothSocket,但如果它是 android.bluetooth.BluetoothSocket,那么这将返回一个 BluetoothOutputStream,它将写入和刷新都直接转发到 BT 套接字。

通常您需要在单个消息/数据包的末尾调用 flush()。当您将大量数据泵入流中时,您不应该调用它。 (因为如果这样做,您可能会降低吞吐量并减少流实现的选项以减少开销)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 2015-07-21
    • 2016-06-12
    • 2012-04-13
    • 2021-08-14
    • 1970-01-01
    • 2012-03-29
    相关资源
    最近更新 更多