我想检查Java中的目录是否为空。但是有可能该目录中有很多文件,所以如果可能的话,我不想查询文件列表。
答案 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)
从 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,它将解决与执行时间相关的问题。”