如何检查OutputStream是否已关闭

时间:2011-12-28 12:24:45

标签: java outputstream java-io

无论如何检查OutputStream是否关闭而不尝试写入并捕获IOException

例如,考虑以下设计方法:

public boolean isStreamClosed(OutputStream out){
    if( /* stream isn't closed */){
        return true;
    }else{
        return false;
    }
}

您可以用{<1}}代替什么?

7 个答案:

答案 0 :(得分:30)

在你尝试写入它之前,底层流可能不会知道它已关闭(例如,如果套接字的另一端关闭它)

最简单的方法是使用它并处理当它关闭时会发生什么,而不是先测试它。

无论您测试什么,总是有可能获得IOException,因此您无法避免异常处理代码。添加此测试可能会使代码复杂化。

答案 1 :(得分:9)

不幸的是,OutputStream API没有类似isClosed()的方法。

所以,我只知道一个明确的方法:创建包含任何其他输出流的类StatusKnowingOutputStream并实现其close()方法如下:

public void close() {
    out.close();
    closed = true;
}

现在添加方法isClosed()

public boolean isClosed() {
    return closed;
}

答案 2 :(得分:2)

OutputStream本身不支持这样的方法。 Closable接口的定义方式是,一旦调用close(),就会丢弃该OutputStream。

也许您应该重新考虑一下应用程序的设计,并检查为什么不这样做,并且最终会在应用程序中运行一个关闭的OutputStream实例。

答案 3 :(得分:2)

public boolean isStreamClosed(FileOutputStream out){
    try {
        FileChannel fc = out.getChannel();
        return fc.position() >= 0L; // This may throw a ClosedChannelException.
    } catch (java.nio.channels.ClosedChannelException cce) {
        return false;
    } catch (IOException e) {
    }
    return true;
}

这仅适用于FileOutputStream!

答案 4 :(得分:1)

没有。如果你实现自己的,你可以写一个isClosed方法,但如果你不知道具体的类,那么没有。 OutputStream只是一个抽象类。这是它的实现:

   /**
 * Closes this output stream and releases any system resources 
 * associated with this stream. The general contract of <code>close</code> 
 * is that it closes the output stream. A closed stream cannot perform 
 * output operations and cannot be reopened.
 * <p>
 * The <code>close</code> method of <code>OutputStream</code> does nothing.
 *
 * @exception  IOException  if an I/O error occurs.
 */
public void close() throws IOException {
}

答案 5 :(得分:0)

如果您在测试中执行此操作,请使用Mockito Spys,然后执行verify

我有效地进行了测试

import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import org.junit.Test;
import java.io.InputStream;

class MyTest {
    @Test
    public void testInputStreamCloseCalled() throws IOException {
        final InputStream spied = spy(...)
    
        // Do something that should call .close() on the spied InputStream
        spied.close()

        verify(spied, times(1)).close();
    }
}

...是您要处理的输入流。

也可以使用OutputStreams。

答案 6 :(得分:-2)

使用out.checkError()

while(!System.out.checkError()) {
    System.out.println('hi');
}

在此处找到:How do I get java to exit when piped to head