簡體   English   中英

Java中如何判斷一個目錄是否為空

[英]How to check if a directory is empty in Java

我想檢查 Java 中的目錄是否為空。但是該目錄中可能有很多文件,所以如果可能的話,我想在不查詢其文件列表的情況下執行此操作。

使用 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();
    }
}
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 它將解決與執行時間相關的問題。

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 中還沒有實現在不列出文件的情況下檢查目錄是否為空。

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

類似於@Minnow 的解決方案(但方法調用較少),此解決方案具有“作為 Files.list 返回延遲填充的 Stream 它將解決與執行時間相關的問題”的好處。

這是一個骯臟的解決方法,但你可以嘗試刪除它(使用delete方法),如果刪除操作失敗,則目錄不為空,如果成功,則目錄為空(但你必須重新創建它,這並不整潔)。 我會繼續尋找更好的解決方案。

編輯:我從 java.nio.file.Files class: http://download.java.net/jdk7/docs/api/java/nio/file/Files.html#walkFileTree(java.nio.file .Path , java.nio.file.FileVisitor) 問題是這只是 Java 7。

我已經搜索了與這個問題相關的其他問題(在不使用 list() 的目錄中列出文件,它為一個大數組分配了 memory),答案總是“你不能,除非你使用 JNI ",這既依賴於平台又丑陋。

如果您可以忍受依賴於平台的代碼 - 您可以通過加載系統庫並使用其 API 來嘗試使用實際的本機代碼。

例如,在 Windows 中,您有一個名為FindFirstFile()Win32 API以及目錄名稱(沒有尾部反斜杠)。 如果它返回的不是. 並且..您知道該目錄不為空。 它不會列出所有文件,因此它比file.list()快得多。

Unix 上的等價物是opendir 出於您的目的,邏輯是相同的。

當然 - 調用本機方法在可用性和初始庫加載方面是有代價的,當它保存在 FS 查詢上時,應該取消這些加載。

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

我想檢查 Java 中的目錄是否為空。 但是該目錄中可能有很多文件,因此如果可能,我想在不查詢其文件列表的情況下執行此操作。

關於如何檢查目錄是否為空,我也有很長一段時間的困惑但是答案很簡單使用

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM