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

时间:2011-05-08 20:19:35

标签: java file-io

我想检查Java中的目录是否为空。但是有可能该目录中有很多文件,所以如果可能的话,我不想查询文件列表。

11 个答案:

答案 0 :(得分:73)

使用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();
    }
}

答案 1 :(得分:19)

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

答案 2 :(得分:8)

java.io.File source code考虑​​,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);

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

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

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

答案 3 :(得分:7)

if(!Files.list(Paths.get(directory)).findAny().isPresent()){
    Files.delete(Paths.get(directory));
 }

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

答案 4 :(得分:4)

这是一个肮脏的解决方法,但您可以尝试删除它(使用delete方法),如果删除操作失败,则目录不为空,如果成功,则为空(但是你必须重新创造它,这不是很整洁)。我会继续寻找更好的解决方案。

编辑:我在java.nio.file.Files上找到了walkFileTree:http://download.java.net/jdk7/docs/api/java/nio/file/Files.html#walkFileTree(java.nio.file.Path,java.nio.file.FileVisitor) 问题是这只是Java 7。

我搜索了S.O.对于与这个问题相关的其他问题(列出目录中的文件没有使用list()为大数组分配内存)并且答案总是“你不能,除非你使用JNI”,这两者都是平台依赖和丑陋。

答案 5 :(得分:3)

如果您可以使用与平台相关的代码 - 您可以通过加载系统库并使用其API来尝试使用实际的本机代码。

在Windows中,例如,您有Win32 API名为FindFirstFile()的目录名称(没有一个尾部反斜杠)。如果它返回...之外的其他内容,则表示该目录不为空。它不会列出所有文件,因此它比file.list()快得多。

Unix上的等价物是opendir。为了您的目的,逻辑将是相同的。

当然 - 调用本机方法会降低可用性和初始库加载的价格,这应该在它将节省FS查询时消除。

答案 6 :(得分:2)

     Path checkIfEmpty=Paths.get("Pathtofile");
     DirectoryStream<Path> ds = Files.newDirectoryStream(checkIfEmpty);
     Iterator files = ds.iterator();
     if(!files.hasNext())
         Files.deleteIfExists(Paths.get(checkIfEmpty.toString()));

答案 7 :(得分:2)

使用 Files.newDirectoryStream

从 Java 7 开始,Files.newDirectoryStream 方法返回一个 DirectoryStream 以迭代目录中的所有条目。所以我们可以使用这个 API 来检查给定的目录是否为空:

public boolean isEmpty(Path path) throws IOException {
    if (Files.isDirectory(path)) {
        try (DirectoryStream<Path> directory = Files.newDirectoryStream(path)) {
            return !directory.iterator().hasNext();
        }
    }

    return false;
}

答案 8 :(得分:0)

我很长时间以来一直有关于如何检查目录是否为空的困惑 但答案很简单 使用

class isFileEmpty{
public static void main(String args[]){
File d = new File(//Path of the Directory you want to check or open);
String path = d.getAbsolutePath().toString();
File dir = new File(path);
File[] files = dir.listFiles();
if(!dir.exists()){
System.out.Println("Directory is Empty");
}
else{
for(int i =0;i<files.length;i++){
System.out.Println(files[i])
           }
       }
   }
}

答案 9 :(得分:0)

我想添加到开发人员的答案。检查它是否在目录中不应该放在一个If运算符中,因为您在逻辑上会出错。首先,您检查是否为目录,只有在检查目录一致性之后,因为如果转移到方法目录不存在,您将得到错误的答案。只是检查一下。应该是这样的:

if (file.isDirectory()) {
    if( file.list().length == 0) {
        logger.info("Directory is empty");
        return false;
    } else {
        logger.info("Directory is not empty");
        return true;
    }
} else {
    return false;
}

答案 10 :(得分:0)

{Participants}
[ID]           [Community]
QWE          US
ASD          US
ZXC          Mexico
{PreForm}
[ID]
QWE
ZXC
{ServiceForm}
[ID]
QWE
{Desired Query}
[Community]    [Part_Count]    [Pre_Count]    [Service_Count]
US             2                1              1
Mexico         1                1

类似于@Minnow的解决方案(但方法调用更少),该解决方案具有以下优点:“由于Files.list返回延迟填充的Stream,它将解决与执行时间相关的问题。”