当我没有关闭流时,我遇到了同样的问题(在Windows Server 2012 R2上)。我迭代的所有文件都在读取模式下打开,直到 JVM 关闭。但是,它没有发生在Mac OS X上,并且由于流依赖于和的依赖于操作系统的实现,因此我认为问题也可能与操作系统有关。FileSystemProvider
DirectoryStream
与@Ian McLaird的评论相反,在Files.list()
文档中提到
如果需要及时处置文件系统资源,则应使用资源试用构造来确保在流操作完成后调用流的 close 方法。
返回的流是一个 ,其 Javadoc 说:DirectoryStream
目录流在创建时打开,并通过调用 close 方法关闭。关闭目录流会释放与该流关联的所有资源。未能关闭流可能会导致资源泄漏。
我的解决方案是遵循建议并使用结构try-with-resources
try (Stream<Path> fileListing = Files.list(directoryPath)) {
// use the fileListing stream
}
当我正确关闭流(使用上面的构造)时,文件句柄立即被释放。try-with-resources
如果您不关心将文件作为流获取,或者您可以将整个文件列表加载到内存中并自己将其转换为流,则可以使用 IO API:
File directory = new File("/path/to/dir");
File[] files = directory.listFiles();
if (files != null) { // 'files' can be null if 'directory' "does not denote a directory, or if an I/O error occurs."
// use the 'files' array or convert to a stream:
Stream<File> fileStream = Arrays.stream(files);
}
我没有遇到任何文件锁定问题。但是,请注意,这两种解决方案都依赖于本机的、依赖于操作系统的代码,因此我建议在您将使用的所有环境中进行测试。