2011-01-31 53 views
34

Những gì tôi cần phải làm gì nếu tìm kiếm một thư mục nói C:\exampleTìm tập tin trong một thư mục sử dụng Java

sau đó tôi cần phải đi qua mỗi tập tin và kiểm tra để xem nếu nó phù hợp với một vài ký tự đầu vì vậy nếu file bắt đầu

temp****.txt 
tempONE.txt 
tempTWO.txt 

Vì vậy, nếu tệp bắt đầu bằng temp và có phần mở rộng .txt Tôi muốn đặt tên tệp đó vào File file = new File("C:/example/temp***.txt); để tôi có thể đọc trong tệp, vòng lặp cần di chuyển sang tệp tiếp theo kiểm tra xem nó có đáp ứng như trên không.

Trả lời

59

Điều bạn muốn là File.listFiles(FileNameFilter filter).

Điều đó sẽ cung cấp cho bạn danh sách các tệp trong thư mục bạn muốn khớp với một bộ lọc nhất định.

Mã sẽ trông giống như:

// your directory 
File f = new File("C:\\example"); 
File[] matchingFiles = f.listFiles(new FilenameFilter() { 
    public boolean accept(File dir, String name) { 
     return name.startsWith("temp") && name.endsWith("txt"); 
    } 
}); 
+2

BTW Java có thể xử lý dấu gạch chéo ('/') tốt trong Windows. Vì vậy, không cần cho dấu gạch chéo ngược (và thoát nó). –

+1

Nếu bạn đang sử dụng Java 7, bạn có thể/nên sử dụng java.nio.FileSystems.getDefault(). GetPath (String dir1, String dir2, ...) để nối các thư mục/tệp theo cách "thực sự đa nền tảng" – beder

+0

@ beder Đó là 'java.nio.file.FileSystems' – TheRealChx101

2

Có một cái nhìn tại java.io.File.list()FilenameFilter.

29

Bạn có thể sử dụng một FilenameFilter, như vậy:

File dir = new File(directory); 

File[] matches = dir.listFiles(new FilenameFilter() 
{ 
    public boolean accept(File dir, String name) 
    { 
    return name.startsWith("temp") && name.endsWith(".txt"); 
    } 
}); 
+1

+1 để có tên biến dễ chịu hơn một chút so với mã gần như giống hệt nhau được đăng 2 phút trước của bạn. –

+1

@Null Set, câu trả lời đó được viết khi tôi đang viết bài của tôi, vì vậy nó không giống như tôi đã sao chép những gì Justin đã viết và đặt lại tên cho các biến ... :) Cảm ơn bạn đã bỏ phiếu. –

+0

'+ 1' Để suy nghĩ giống như cách tôi đã làm. – jjnguy

3

Cân nhắc Apache Commons IO, nó có một lớp được gọi là FileUtils rằng có một phương pháp listFiles mà có thể rất hữu ích trong trường hợp của bạn.

1

Appache commons IO khác nhau

FilenameUtils.wildcardMatch

Xem Apache javadoc here. Nó khớp với ký tự đại diện với tên tệp. Vì vậy, bạn có thể sử dụng phương pháp này để so sánh của bạn.

+0

Vì vậy, các câu trả lời ngắn gọn dễ bị gắn cờ là chất lượng thấp. – joaquin

+0

Danh tiếng của tôi không cho phép tôi thêm nhận xét. Cách duy nhất tôi có thể đóng góp là thêm một câu trả lời khác. Tôi đã chỉnh sửa bài đăng gốc của mình để thêm chi tiết. – eugene

2

Để liệt kê các tệp Json khỏi thư mục đã cho của bạn.

import java.io.File; 
    import java.io.FilenameFilter; 

    public class ListOutFilesInDir { 
     public static void main(String[] args) throws Exception { 

      File[] fileList = getFileList("directory path"); 

      for(File file : fileList) { 
       System.out.println(file.getName()); 
      } 
     } 

     private static File[] getFileList(String dirPath) { 
      File dir = new File(dirPath); 

      File[] fileList = dir.listFiles(new FilenameFilter() { 
       public boolean accept(File dir, String name) { 
        return name.endsWith(".json"); 
       } 
      }); 
      return fileList; 
     } 
    } 
1

Như @Clarke cho biết, bạn có thể sử dụng java.io.FilenameFilter để lọc tệp theo điều kiện cụ thể.

Là phần bổ sung, tôi muốn hiển thị cách sử dụng java.io.FilenameFilter để tìm kiếm tệp trong thư mục hiện tại và thư mục con của nó.

Phương thức chung getTargetFiles và printFiles được sử dụng để tìm kiếm tệp và in chúng.

public class SearchFiles { 

    //It's used in dfs 
    private Map<String, Boolean> map = new HashMap<String, Boolean>(); 

    private File root; 

    public SearchFiles(File root){ 
     this.root = root; 
    } 

    /** 
    * List eligible files on current path 
    * @param directory 
    *  The directory to be searched 
    * @return 
    *  Eligible files 
    */ 
    private String[] getTargetFiles(File directory){ 
     if(directory == null){ 
      return null; 
     } 

     String[] files = directory.list(new FilenameFilter(){ 

      @Override 
      public boolean accept(File dir, String name) { 
       // TODO Auto-generated method stub 
       return name.startsWith("Temp") && name.endsWith(".txt"); 
      } 

     }); 

     return files; 
    } 

    /** 
    * Print all eligible files 
    */ 
    private void printFiles(String[] targets){ 
     for(String target: targets){ 
      System.out.println(target); 
     } 
    } 
} 

tôi sẽ giới thiệu cách sử dụng đệ quy, BFSdfs để hoàn thành công việc.

Recursive:

/** 
* How many files in the parent directory and its subdirectory <br> 
* depends on how many files in each subdirectory and their subdirectory 
*/ 
private void recursive(File path){ 

    printFiles(getTargetFiles(path)); 
    for(File file: path.listFiles()){ 
     if(file.isDirectory()){ 
      recursive(file); 
     } 
    } 
    if(path.isDirectory()){ 
     printFiles(getTargetFiles(path)); 
    } 
} 

public static void main(String args[]){ 
    SearchFiles searcher = new SearchFiles(new File("C:\\example")); 
    searcher.recursive(searcher.root); 
} 

Chiều rộng tìm kiếm đầu tiên:

/** 
* Search the node's neighbors firstly before moving to the next level neighbors 
*/ 
private void bfs(){ 
    if(root == null){ 
     return; 
    } 

    Queue<File> queue = new LinkedList<File>(); 
    queue.add(root); 

    while(!queue.isEmpty()){ 
     File node = queue.remove(); 
     printFiles(getTargetFiles(node)); 
     File[] childs = node.listFiles(new FileFilter(){ 

      @Override 
      public boolean accept(File pathname) { 
       // TODO Auto-generated method stub 
       if(pathname.isDirectory()) 
        return true; 

       return false; 
      } 

     }); 

     if(childs != null){ 
      for(File child: childs){ 
       queue.add(child); 
      } 
     } 
    } 
} 

public static void main(String args[]){ 
    SearchFiles searcher = new SearchFiles(new File("C:\\example")); 
    searcher.bfs(); 
} 

Depth First Search:

/** * Tìm kiếm càng nhiều càng tốt cùng nhau chi nhánh bef quặng backtracking */ trống dfs tin() {

if(root == null){ 
     return; 
    } 

    Stack<File> stack = new Stack<File>(); 
    stack.push(root); 
    map.put(root.getAbsolutePath(), true); 
    while(!stack.isEmpty()){ 
     File node = stack.peek(); 
     File child = getUnvisitedChild(node); 

     if(child != null){ 
      stack.push(child); 
      printFiles(getTargetFiles(child)); 
      map.put(child.getAbsolutePath(), true); 
     }else{ 
      stack.pop(); 
     } 

    } 
} 

/** 
* Get unvisited node of the node 
* 
*/ 
private File getUnvisitedChild(File node){ 

    File[] childs = node.listFiles(new FileFilter(){ 

     @Override 
     public boolean accept(File pathname) { 
      // TODO Auto-generated method stub 
      if(pathname.isDirectory()) 
       return true; 

      return false; 
     } 

    }); 

    if(childs == null){ 
     return null; 
    } 

    for(File child: childs){ 

     if(map.containsKey(child.getAbsolutePath()) == false){ 
      map.put(child.getAbsolutePath(), false); 
     } 

     if(map.get(child.getAbsolutePath()) == false){ 
      return child; 
     } 
    } 

    return null; 
} 

public static void main(String args[]){ 
    SearchFiles searcher = new SearchFiles(new File("C:\\example")); 
    searcher.dfs(); 
} 
5

Tôi biết, đây là một câu hỏi cũ. Nhưng chỉ vì lợi ích của sự hoàn chỉnh, phiên bản lambda.

File dir = new File(directory); 
File[] files = dir.listFiles((dir1, name) -> name.startsWith("temp") && name.endsWith(".txt")); 
Các vấn đề liên quan