2010-01-20 57 views
63

Tôi đang tìm cách lấy danh sách các tệp khớp với mẫu (pref regex) trong một thư mục nhất định.Liệt kê các tệp trong một thư mục khớp với mẫu trong Java

Tôi đã tìm thấy một trực tuyến hướng dẫn sử dụng của apache commons-io gói với đoạn mã sau:

Collection getAllFilesThatMatchFilenameExtension(String directoryName, String extension) 
{ 
    File directory = new File(directoryName); 
    return FileUtils.listFiles(directory, new WildcardFileFilter(extension), null); 
} 

Nhưng đó chỉ trả về một bộ sưu tập cơ sở (Theo the docs đó là một bộ sưu tập các java.io.File). Có cách nào để thực hiện việc này trả về một bộ sưu tập chung loại an toàn không?

+0

tại sao không bạn chỉ cần thêm một diễn viên? Tôi cho rằng bộ sưu tập cơ bản là vì lý do tương thích (với phiên bản java cũ hơn). Nếu bạn muốn hoàn toàn chắc chắn, bạn chỉ có thể tạo một bản sao và thêm các yếu tố sau khi kiểm tra loại (generics chỉ là kiểm tra thời gian biên dịch, anyway) – bertolami

+0

@bertolami, không đặt câu trả lời trong nhận xét. :) –

+1

5 năm sau khi nhận xét đã được thực hiện ... Đó là một số necromancy mạnh mẽ có @LimitedAtonement –

Trả lời

96

Xem File#listFiles(FilenameFilter).

File dir = new File("."); 
File [] files = dir.listFiles(new FilenameFilter() { 
    @Override 
    public boolean accept(File dir, String name) { 
     return name.endsWith(".xml"); 
    } 
}); 

for (File xmlfile : files) { 
    System.out.println(xmlfile); 
} 
+1

Điều này có nghĩa rằng java đọc trong tất cả các tập tin và sau đó ném đi những người không phù hợp. Điều này không quá chậm so với bất kỳ lệnh hệ thống nào tự lọc chính nó? – flaschenpost

+1

@flaschenpost Không nhất thiết, vì tài liệu không hứa hẹn về cách triển khai xử lý bộ nhớ đệm và các chi tiết liên quan đến hiệu suất khác. Ràng buộc chính trên bất kỳ phương thức nào thuộc loại này là cuộc gọi IO xuống đĩa để đọc siêu dữ liệu tệp. Một lệnh hệ thống sẽ vẫn phải đọc tất cả các thông tin tương tự, vì vậy nó có thể đủ gần mà nó không đáng lo ngại. Xử lý nó trong Java tinh khiết cho phép người khác xử lý các vấn đề cụ thể của nền tảng liên quan đến việc nhận siêu dữ liệu đó. – Morgen

+1

OK. Tôi chỉ được sử dụng để tất cả các ngôn ngữ với một phương pháp 'glob', và tôi hy vọng nó chạy bên trong hệ thống tập tin thực hiện và để được khoảng 100x nhanh hơn (nhưng đã không kiểm tra này). Nhưng tôi vẫn phải quen với phong cách java, nơi 'nhanh' có nghĩa là giây thay vì nano giây. ;-) – flaschenpost

14

Mã sau sẽ tạo danh sách tệp dựa trên phương thức chấp nhận của FileNameFilter.

List<File> list = Arrays.asList(dir.listFiles(new FilenameFilter(){ 
     @Override 
     public boolean accept(File dir, String name) { 
      return name.endsWith(".exe"); // or something else 
     }})); 
+0

Điều này cần chỉ định một bit khớp mẫu. – BobMcGee

0

gì về một wrapper xung quanh mã hiện tại của bạn:

public Collection<File> getMatchingFiles(String directory, String extension) { 
    return new ArrayList<File>()( 
     getAllFilesThatMatchFilenameExtension(directory, extension)); 
} 

tôi sẽ ném một cảnh báo mặc dù. Nếu bạn có thể sống với cảnh báo đó, thì bạn đã hoàn tất.

12

Kể từ java 7 bạn có thể các java.nio gói để đạt được kết quả tương tự:

Path dir = ...; 
List<File> files = new ArrayList<>(); 
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.{java,class,jar}")) { 
    for (Path entry: stream) { 
     files.add(entry.toFile()); 
    } 
    return files; 
} catch (IOException x) { 
    throw new RuntimeException(String.format("error reading folder %s: %s", 
    dir, 
    x.getMessage()), 
    x); 
} 
25

Kể từ Java 8 bạn có thể sử dụng lambdas và đạt được mã ngắn hơn:

File dir = new File(xmlFilesDirectory); 
File[] files = dir.listFiles((d, name) -> name.endsWith(".xml")); 
1
import java.io.BufferedReader; 

import java.io.File; 

import java.io.FileReader; 

import java.io.IOException; 

import java.util.Map; 

import java.util.Scanner; 

import java.util.TreeMap; 

public class CharCountFromAllFilesInFolder { 

    public static void main(String[] args)throws IOException { 

     try{ 

      //C:\Users\MD\Desktop\Test1 

      System.out.println("Enter Your FilePath:"); 

      Scanner sc = new Scanner(System.in); 

      Map<Character,Integer> hm = new TreeMap<Character, Integer>(); 

      String s1 = sc.nextLine(); 

      File file = new File(s1); 

      File[] filearr = file.listFiles(); 

      for (File file2 : filearr) { 
       System.out.println(file2.getName()); 
       FileReader fr = new FileReader(file2); 
       BufferedReader br = new BufferedReader(fr); 
       String s2 = br.readLine(); 
       for (int i = 0; i < s2.length(); i++) { 
        if(!hm.containsKey(s2.charAt(i))){ 
         hm.put(s2.charAt(i), 1); 
        }//if 
        else{ 
         hm.put(s2.charAt(i), hm.get(s2.charAt(i))+1); 
        }//else 

       }//for2 

       System.out.println("The Char Count: "+hm); 
      }//for1 

     }//try 
     catch(Exception e){ 
      System.out.println("Please Give Correct File Path:"); 
     }//catch 
    } 
} 
Các vấn đề liên quan