学习使用NIO APIs在Java中检查一个目录是否为空,或包含任何文件。
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
一个目录流允许方便地使用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教程中,我们学习了一些经过性能验证的方法来检查一个给定的目录是否是空的。我们利用流的懒惰行为来提高性能,否则在大文件夹的情况下,有时是一个非常昂贵的操作。
祝你学习愉快!!