如何检查Java中的目录是否为空

Csq*_*Csq 56 java file-io

我想检查Java中的目录是否为空.但是有可能该目录中有许多文件,所以我想在不查询文件列表的情况下这样做,如果可能的话.

小智 84

使用JDK7,您可以使用Files.newDirectoryStream打开目录,然后使用迭代器的hasNext()方法测试是否有任何文件到迭代器(不要忘记关闭流).与java.io.File列表方法相比,这对于大型目录或目录在远程文件系统上的情况应该更好.

例:

private static boolean isDirEmpty(final Path directory) throws IOException {
    try(DirectoryStream<Path> dirStream = Files.newDirectoryStream(directory)) {
        return !dirStream.iterator().hasNext();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @jonr,他在示例中使用了 try-with-resources,因此在退出块时流会自动关闭。 (4认同)

Div*_*shu 23

File parentDir =  file.getParentFile();
if(parentDir.isDirectory() && parentDir.list().length == 0) {
    LOGGER.info("Directory is empty");
} else {
    LOGGER.info("Directory is not empty");
}
Run Code Online (Sandbox Code Playgroud)

  • “不查询其文件列表” (6认同)

Min*_*now 9

if(!Files.list(Paths.get(directory)).findAny().isPresent()){
    Files.delete(Paths.get(directory));
 }
Run Code Online (Sandbox Code Playgroud)

当Files.list返回延迟填充的Stream时,它将解决与执行时间有关的问题。


JMe*_*nik 8

源代码考虑,方法做:java.io.File list()

    public java.lang.String[] list() {
    ...
        byte[][] implList = listImpl(bs);
        if (implList == null) {
           // empty list
           return new String[0];
        }     
     ...
     }

     private synchronized static native byte[][] listImpl(byte[] path);
Run Code Online (Sandbox Code Playgroud)

它调用一个传递字节数组的本机方法来从中获取文件.如果方法返回,null则表示目录为空.

这意味着,他们甚至没有本地方法,在没有列出文件的情况下检查目录空白,所以他们没有办法在java中有一个实现来检查目录是否为空.

结果:检查目录是否为空而没有列出文件尚未在java中实现.


Pen*_*eng 6

boolean isEmptyDirectory(Path dir) throws IOException {
    try (var entries = Files.list(dir)) {
        return entries.count() == 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

与 @Minnow 的解决方案类似(但方法调用较少),该解决方案的优点是“当 Files.list 返回一个延迟填充的 Stream 时,它将解决与执行时间相关的问题。”

  • 我想 count 无论如何都会加载所有目录条目。“entries.findFirst().isPresent()”不是更好的解决方案吗? (2认同)