【发布时间】:2021-12-13 15:35:57
【问题描述】:
我正在计划创建并返回一个 InputStream 的函数,该函数又从另一个 InputStream 读取,因为该 InputStream 的初始化并不简单,我想在多个地方使用它。考虑这个简单的例子:
private static InputStream openStream() throws IOException {
Path path = Paths.get("/etc/passwd");
InputStream inputStream = Files.newInputStream(path);
return new BufferedInputStream(inputStream);
}
我将使用这个函数如下:
public static void main(String[] args) {
try (InputStream stream = openStream()) {
byte[] buffer = new byte[1024];
int numBytes;
while ((numBytes = stream.read(buffer, 0, buffer.length)) > 0) {
System.out.printf("Just read %d bytes from stream!%n", numBytes);
}
} catch (IOException e) {
e.printStackTrace();
}
}
但是,我担心在此示例中关闭 BufferedInputStream 不会关闭其中的 InputStream。如果多次调用,这会导致孤立的文件句柄和内存泄漏吗?有什么更好的解决方案?
我能想到的一个简单解决方案是定义一个可关闭的容器类并将两个输入流放入该类。当调用close() 时,这个类会简单地关闭它所有打开的句柄。
class StreamContainer implements Closeable {
private final InputStream[] inputStreams;
public StreamContainer(InputStream... inputStreams) {
this.inputStreams = inputStreams;
}
@Override
public void close() throws IOException {
for (InputStream inputStream : this.inputStreams) {
inputStream.close();
}
}
}
但我想,可能会有更好的解决方案,内置机制或开发模式。或者也许应该避免这些结构?
【问题讨论】:
-
我认为它会被关闭。见stackoverflow.com/questions/11263926/…。 “按照惯例,包装流(包装现有流)在关闭底层流时会关闭它们”
标签: java resources inputstream