2011-02-07 30 views
77

thể trùng lặp:
Best way to iterate through a directory in java?Làm thế nào để lặp qua các tập tin của một thư mục nhất định, trong Java?

Tôi muốn để xử lý mỗi tập tin trong một thư mục nào đó sử dụng Java.

Cách dễ nhất (và phổ biến nhất) để thực hiện việc này là gì?

+2

Bản sao của: http://stackoverflow.com/questions/3154488/best-way-to-iterate-through-a-directory-in-java – Olhovsky

Trả lời

139

Nếu bạn có tên thư mục trong myDirectoryPath,

import java.io.File; 
... 
    File dir = new File(myDirectoryPath); 
    File[] directoryListing = dir.listFiles(); 
    if (directoryListing != null) { 
    for (File child : directoryListing) { 
     // Do something with child 
    } 
    } else { 
    // Handle the case where dir is not really a directory. 
    // Checking dir.isDirectory() above would not be sufficient 
    // to avoid race conditions with another process that deletes 
    // directories. 
    } 
+1

Javado nói trong listFiles(): "Tên đường dẫn biểu thị thư mục chính nó và thư mục cha của thư mục không được bao gồm trong kết quả. " – pihentagy

+0

@pihentagy, tôi không biết điều đó. Cảm ơn. –

+1

fyi nếu bạn muốn thư mục hiện tại bạn có thể sử dụng 'tệp mới (". "); ' – Csanesz

6

Dưới đây là một ví dụ liệt kê tất cả các tập tin trên máy tính để bàn của tôi. bạn nên thay đổi biến đường dẫn đến đường dẫn của bạn.

Thay vì in tên tệp bằng System.out.println, bạn nên đặt mã của riêng mình để hoạt động trên tệp.

public static void main(String[] args) { 
    File path = new File("c:/documents and settings/Zachary/desktop"); 

    File [] files = path.listFiles(); 
    for (int i = 0; i < files.length; i++){ 
     if (files[i].isFile()){ //this line weeds out other directories/folders 
      System.out.println(files[i]); 
     } 
    } 
} 
3

Sử dụng java.io.File.listFiles
Hoặc
Nếu bạn muốn lọc danh sách trước khi lặp đi lặp lại (hoặc bất kỳ trường hợp sử dụng phức tạp hơn), sử dụng apache-commons FileUtils. FileUtils.listFiles

+0

'listFiles' được ghi đè để lấy bộ lọc tệp hoặc bộ lọc tên tệp để không cần sử dụng apache-commons nếu điều duy nhất bạn muốn lọc. Mặc dù nó là một thư viện tốt. –

27

Tôi đoán có rất nhiều cách để thực hiện những gì bạn muốn. Đây là cách tôi sử dụng. Với thư viện commons.io bạn có thể lặp qua các tệp trong một thư mục. Bạn phải sử dụng phương thức FileUtils.iterateFiles và bạn có thể xử lý từng tệp.

Bạn có thể tìm thấy thông tin ở đây: http://commons.apache.org/proper/commons-io/download_io.cgi

Dưới đây là một ví dụ:

Iterator it = FileUtils.iterateFiles(new File("C:/"), null, false); 
     while(it.hasNext()){ 
      System.out.println(((File) it.next()).getName()); 
     } 

Bạn có thể thay đổi null và đặt một danh sách các extentions nếu bạn muốn lọc. Ví dụ: {".xml",".java"}

+0

Tôi đã cố gắng không sử dụng thư viện của bên thứ 3, nhưng FileUtil của apache dường như có rất nhiều phương pháp hữu ích. Cảm ơn. +1 –

+0

Có ... thực sự tất cả các thư viện commons từ apache thực sự tốt, bao gồm rất nhiều tính năng mà chúng ta có thể được trát mã. Commons.collections là một ví dụ tốt. – jomaora

+3

@ john-assymptoth, mà không có lib này và chỉ java thực hiện util bạn sẽ lái xe trong 'StackOverflowError' nếu thư viện có chứa rất nhiều tập tin. (http://java.sun.com/javase/6/docs/api/java/lang/StackOverflowError.html) – Rihards

Các vấn đề liên quan