什么时候关闭 HSSFWorkbook 的构造函数中使用的 InputStream 对象?

When to close the InputStream object used in the constructor of HSSFWorkbook?

我正在使用 HSSFWorkbook,我想知道我应该在哪里关闭我在构建 HSSFWorkbook 对象时使用的 InputStream 对象。 HSSFWorkbook 是否在其构造函数本身中关闭流?还是我们需要手动关闭它?我们可以在构造函数调用后立即关闭它吗?即,HSSFWorkbook 对象是否仅在其构造函数中使用 InputStream 对象?还是将来也可以使用它(在这种情况下我们不能关闭它)?谢谢。

public HSSFWorkbook loadSheet(File file) throws FileNotFoundException, IOException {
    return new HSSFWorkbook(new FileInputStream(file)); 
}

HSSFWorkbook 的构造函数没有说明 InputStream 是关闭还是打开,所以乍一看你不应该假设它会关闭。然而,深入挖掘,另一方面,在构造函数本身中使用的 class 的构造函数确实清楚地说明了它的行为。

至少在 Apache POI 4.0.0 中,对 new HSSFWorkbook(inputStream) 的调用将导致对 new POIFSFileSystem(inputStream) 的调用,在其实现中,确实似乎总是关闭流和构造函数文档证实了。

这似乎指向您问题的以下答案:

  • HSSFWorkbook 是否在其构造函数本身中关闭流?是的,间接地。
  • 还是需要手动关闭?显然不是,除非他们决定不再依赖 POIFSFileSystem,这似乎不太可能。
  • 我们可以在构造函数调用后立即关闭它吗?显然,是的......但没有必要。
  • HSSFWorkbook 对象仅在其构造函数中使用 InputStream 对象吗?显然是这样。