Java:返回 BufferedInputStream 后关闭



我正在计划一个函数来创建并返回一个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();
}
}
}

但我想,可能会有更好的解决方案,内置机制或开发模式。或者也许应该避免这些结构?

在这种情况下,您应该阅读BufferedInputStream的代码源,这是接近的定义

public void close() throws IOException {
while(true) {
byte[] buffer;
if ((buffer = this.buf) != null) {
if (!U.compareAndSetObject(this, BUF_OFFSET, buffer, (Object)null)) {
continue;
}
InputStream input = this.in;
this.in = null;
if (input != null) {
input.close();
}
return;
}
return;
}
}

正如您在关闭缓冲输入流时所看到的,基础输入流也已关闭。

这是关闭的文档:

公共无效关闭() 抛出 IOException 关闭此输入流并释放与该流关联的任何系统资源。一旦 流已关闭,进一步读取(),可用(),重置(),或 skip() 调用将抛出 IOException。关闭以前的 封闭的流不起作用。

相关内容

  • 没有找到相关文章

最新更新