文
章
目
录
章
目
录
学习使用Java NIO API检查目录是否为空或包含任何文件。
1.使用Files.list()
Files.list(dirPath)返回给定路径中(非递归)的惰性填充的文件和目录流。我们可以使用stream.findAny()方法,如果目录为空,则返回一个空的Optional。
- 如果指定的路径不是目录,则会抛出NotDirectoryException。
- 通过关闭流来关闭目录。
此findAny()方法是一种短路终端操作,可以在选择流中的任何元素后得出结果,因此它不需要在做出决定之前查看整个目录及其文件。对于非常大的目录,这使得这种方法成为高效性能的好解决方案。
Path dirPath = Paths.get("C:/temp");
boolean isEmptyDirectory = Files.list(dirPath).findAny().isPresent();
2. 使用DirectoryStream
DirectoryStream允许使用for-each构造来迭代目录。
DirectoryStream在创建时打开,并通过调用close()方法关闭。或者,我们应该使用try-with-resources语句,该语句会在使用后自动关闭流。
通过使用目录流的迭代器,我们可以调用它的hasNext()方法来检查流中是否有任何文件/目录元素。如果目录为空,hasNext()将返回false。
Path dirPath = Paths.get("C:/temp");
boolean isEmptyDirectory = false;
if (Files.isDirectory(dirPath)) {
try (DirectoryStream<Path> dirStream =
Files.newDirectoryStream(dirPath)) {
isEmptyDirectory = !dirStream.iterator().hasNext();
}
}
3. 结论
在本Java教程中,我们学习了几个性能证明的方法来检查给定目录是否为空。我们利用流的惰性行为来提高性能,否则在处理大型文件夹时有时会是非常昂贵的操作。