[英]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 ",這既依賴於平台又丑陋。
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.