如何检查Java中的目录是否为空
我想检查在Java目录是空的。 但是有一个可能性,那个目录中有很多文件,所以如果可能的话,我想这样做而不查询它的文件列表。
使用JDK7,您可以使用Files.newDirectoryStream打开目录,然后使用迭代器的hasNext()方法来testing是否有任何要迭代的文件(不要忘记closuresstream)。 与java.io.File列表方法相比,这对于大型目录或者远程文件系统中的目录应该更好。
例:
private static boolean isDirEmpty(final Path directory) throws IOException { try(DirectoryStream<Path> dirStream = Files.newDirectoryStream(directory)) { return !dirStream.iterator().hasNext(); } }
从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中实现。
File parentDir = file.getParentFile(); if(parentDir.isDirectory() && parentDir.list().length == 0) { LOGGER.info("Directory is empty"); } else { LOGGER.info("Directory is not empty"); }
这是一个肮脏的解决方法,但您可以尝试删除它(使用delete
方法),如果删除操作失败,那么该目录不是空的,如果成功,那么它是空的(但你必须重新创build它,这并不整齐)。 我会继续寻找更好的解决scheme。
编辑 :我发现从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。
我已经search了与其他问题相关的这个问题(列出文件在一个目录W / O使用列表()分配内存为一个大阵),答案总是“你不能,除非你使用JNI “这既是平台依赖又丑陋的。
如果您可以使用平台相关的代码 – 您可以尝试使用实际的本地代码加载系统库并使用其API。
在Windows中,例如,您有一个名为FindFirstFile()
的Win32 API ,其目录名称( 没有尾部反斜杠)。 如果它返回的东西不是.
而..
你知道目录不是空的。 它不会列出所有的文件,所以比file.list()
快得多。
Unix上的等价物是opendir
。 为了你的目的,逻辑将是相同的。
当然,调用本地方法对可用性和初始化的库加载都有一定的代价,在FS查询中应该节省时间。
if(!Files.list(Paths.get(directory)).findAny().isPresent()){ Files.delete(Paths.get(directory)); }
作为Files.list返回一个延迟填充的stream它将解决您的执行时间相关的问题。
Path checkIfEmpty=Paths.get("Pathtofile"); DirectoryStream<Path> ds = Files.newDirectoryStream(checkIfEmpty); Iterator files = ds.iterator(); if(!files.hasNext()) Files.deleteIfExists(Paths.get(checkIfEmpty.toString()));
我也有很长一段时间这个混淆关于如何检查目录是否为空但是答案非常简单的用法
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]) } } } }