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

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

70469 次浏览

这是一个肮脏的解决方案,但是你可以尝试删除它(使用 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) 问题是这只是 Java7。

我在 S.O. 中搜索了与这个问题相关的其他问题(使用 list ()列出目录 w/o 中的文件,它为一个大数组分配内存) ,答案总是“你不能,除非你使用 JNI”,这既依赖于平台,也很难看。

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

例如,在 Windows 中,有一个名为 FindFirstFile()Win32API目录名(没有后面有一个反斜杠)。如果它返回除 ...之外的其他内容,那么您就知道该目录不是空的。它不会列出所有的文件,所以它比 file.list()快得多。

Unix 上的等价物是 opendir。对于您的目的,逻辑是相同的。

当然,调用本机方法在可用性和初始库加载方面有一定的代价,当它在 FS 查询上节省时,这些代价应该被抵消。

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);

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

这意味着 ,他们甚至没有一个本机方法,在没有列出文件的情况下检查目录是否为空,所以他们不可能用 Java 实现来检查目录是否为空。

结果 : 检查没有列出文件的目录是否为空,但是还没有在 Java 中实现。

使用 JDK7,您可以使用 Files.newDirectoryStream 打开目录,然后使用迭代器的 hasNext ()方法来测试是否存在需要迭代器遍历的文件(不要忘记关闭流)。与 java.io 相比,对于大型目录或目录位于远程文件系统上的目录,这种方法应该能够更好地工作。文件列表方法。

例如:

private static boolean isDirEmpty(final Path directory) throws IOException {
try(DirectoryStream<Path> dirStream = Files.newDirectoryStream(directory)) {
return !dirStream.iterator().hasNext();
}
}
     Path checkIfEmpty=Paths.get("Pathtofile");
DirectoryStream<Path> ds = Files.newDirectoryStream(checkIfEmpty);
Iterator files = ds.iterator();
if(!files.hasNext())
Files.deleteIfExists(Paths.get(checkIfEmpty.toString()));
File parentDir =  file.getParentFile();
if(parentDir.isDirectory() && parentDir.list().length == 0) {
LOGGER.info("Directory is empty");
} else {
LOGGER.info("Directory is not empty");
}
if(!Files.list(Paths.get(directory)).findAny().isPresent()){
Files.delete(Paths.get(directory));
}

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

关于如何检查目录是否为空,我也困惑了很长时间 但答案很简单 使用

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])
}
}
}
}

我想添加到开发人员的答案。检查是否是目录不应该在一个 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;
}
boolean isEmptyDirectory(Path dir) throws IOException {
try (var entries = Files.list(dir)) {
return entries.count() == 0;
}
}

与@Minnow 的解决方案类似(但方法调用较少) ,这个解决方案的好处是“ As Files.list Return a Lazily 填充的 Stream,它将解决与执行时间相关的问题。”