我有一个类,在某些情况下,从公共方法返回InputStream
似乎是正确的。
public class MyClass {
private File _file;
...
public InputStream getInputStream() {
return new FileInputStream( _file );
}
}
然而,我对这样做也非常谨慎,因为它将关闭这个流的责任放在了调用者身上。有哪些方式可以避免这个问题?
我有一个类,在某些情况下,从公共方法返回InputStream
似乎是正确的。
public class MyClass {
private File _file;
...
public InputStream getInputStream() {
return new FileInputStream( _file );
}
}
然而,我对这样做也非常谨慎,因为它将关闭这个流的责任放在了调用者身上。有哪些方式可以避免这个问题?
这取决于您认为这是一个问题的原因。如果您必须返回一个InputStream
并且所述文件不太大,您可以将整个文件缓冲到字节数组中,关闭原始流,并return new ByteArrayInputStream(buf)
。关闭ByteArrayInputStream
不是必要的(实际上没有效果)。
但是,如果返回InputStream
“感觉正确”,难道调用者不应该期望一个InputStream
及其相关内容,包括完成后需要关闭流吗?
返回InputStream
并不是本质上的坏事。现在,如果您希望调用者能够访问数据而无需负责关闭资源,则可以这样做:
interface InputReader {
void readInput(InputStream is);
}
public class MyClass {
void feed(InputReader ir){
try(InputStream is=new FileInputStream( _file )){
ir.readInput(is);
}
}
}
InputReader
实例作为参数接收可关闭资源,并不再负责关闭它。MyClass myClass = ... ; //Get the instance
myClass.feed( new InputReader() {
@Override
void readInput(InputStream is){
... ; // Use at will without closing
}
});
在将InputStream
传递给InputReader
之前,应考虑对其进行装饰,以便.close()
引发异常。
您可以在您的类中放置一个close()
方法,以清除任何打开的文件处理程序、连接等,并要求该类的用户负责调用close()
。请参见此问题以了解如何使用finalize
方法来跟踪调用者是否正确关闭您的类。
ServletResponse.getOutputStream()
)。 - Harry Cutts