无论如何检查OutputStream是否关闭而不尝试写入并捕获IOException
?
例如,考虑以下设计方法:
public boolean isStreamClosed(OutputStream out){
if( /* stream isn't closed */){
return true;
}else{
return false;
}
}
您可以用{<1}}代替什么?
答案 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');
}