2009-09-06 44 views
45

Có mã Java được tích hợp sẵn sẽ phân tích cú pháp một thư mục nhất định và tìm kiếm nó cho các tệp .txt không?Java: Tìm tệp .txt trong thư mục được chỉ định

+2

Có thể là câu trả lời được nền tảng cụ thể? – Milhous

+0

Xem thêm http://stackoverflow.com/questions/794381/how-to-find-files-that-match-a-wildcard-string-in-java – Vadzim

+5

Đây là câu hỏi thực sự. Nếu nó khó hiểu vì nó sẽ cần phải được đóng lại, thì sẽ không có câu trả lời mà không chỉ trả lời câu hỏi một cách hoàn hảo, mà còn có 89 upvotes. – SpaceCore186

Trả lời

110

Bạn có thể sử dụng phương pháp listFiles() được cung cấp bởi lớp java.io.File.

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

public class Filter { 

    public File[] finder(String dirName){ 
     File dir = new File(dirName); 

     return dir.listFiles(new FilenameFilter() { 
       public boolean accept(File dir, String filename) 
         { return filename.endsWith(".txt"); } 
     }); 

    } 

} 
+1

@Funsuk, điều này làm việc cho tôi tốt, ít nhất là cho các trường hợp thử nghiệm đơn giản tôi đã cố gắng. 36 người dường như đồng ý. Bằng cách nào nó không hoạt động cho bạn? – djna

20

Hãy thử:

List<String> textFiles(String directory) { 
    List<String> textFiles = new ArrayList<String>(); 
    File dir = new File(directory); 
    for (File file : dir.listFiles()) { 
    if (file.getName().endsWith((".txt"))) { 
     textFiles.add(file.getName()); 
    } 
    } 
    return textFiles; 
} 

Bạn muốn làm một trường hợp tìm kiếm không nhạy cảm trong trường hợp này:

if (file.getName().toLowerCase().endsWith((".txt"))) { 

Nếu bạn muốn một cách đệ quy tìm kiếm thông qua một cây thư mục cho các tập tin văn bản, bạn sẽ có có khả năng thích nghi ở trên như là một hàm đệ quy hoặc một hàm lặp lại bằng cách sử dụng một ngăn xếp.

+0

Có vẻ tốt. Hãy để tôi thử điều này .. – Sri

-2

Đây là mã của tôi nền tảng cụ thể (unix)

public static List<File> findFiles(String dir, String... names) 
    { 
     LinkedList<String> command = new LinkedList<String>(); 
     command.add("/usr/bin/find"); 
     command.add(dir); 
     List<File> result = new LinkedList<File>(); 
     if (names.length > 1) 
      { 
       List<String> newNames = new LinkedList<String>(Arrays.asList(names)); 
       String first = newNames.remove(0); 
       command.add("-name"); 
       command.add(first); 
       for (String newName : newNames) 
        { 
         command.add("-or"); 
         command.add("-name"); 
         command.add(newName); 
        } 
      } 
     else if (names.length > 0) 
      { 
       command.add("-name"); 
       command.add(names[0]); 
      } 
     try 
      { 
       ProcessBuilder pb = new ProcessBuilder(command); 
       Process p = pb.start(); 
       p.waitFor(); 
       InputStream is = p.getInputStream(); 
       InputStreamReader isr = new InputStreamReader(is); 
       BufferedReader br = new BufferedReader(isr); 
       String line; 
       while ((line = br.readLine()) != null) 
        { 
         // System.err.println(line); 
         result.add(new File(line)); 
        } 
       p.destroy(); 
      } 
     catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     return result; 
    } 
+4

Tại sao mọi người lại muốn sử dụng điều này khi có giải pháp đa nền tảng dễ dàng hơn nhiều? – BlueSilver

+0

Một lý do để sử dụng phiên bản gốc là tránh đọc một danh sách lớn các tệp trong một thư mục dài. Trong Java 6, lớp 'java.io.File' không bao gồm các phương thức đọc các tệp trong một thư mục dưới dạng luồng hoặc sử dụng trình lặp. Việc triển khai Java 6 của 'File.listFiles (FileFilter)' và 'File.listFiles (FilenameFilter) 'cả hai đầu tiên đọc tất cả các tập tin từ một thư mục và sau đó áp dụng các bộ lọc. Khi gặp phải một thư mục chứa hàng triệu tập tin, ví dụ, 'File.listFiles' có thể đọc rất nhiều tập tin mà nó có thể tiêu thụ tất cả bộ nhớ heap trong JVM. –

+0

Xem http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/21487ef30163/src/share/classes/java/io/File.java để thực hiện 'File.listFiles (FileFilter)'. –

6

Nó thực sự hữu ích, tôi đã sử dụng nó với một thay đổi nhỏ:

filename=directory.list(new FilenameFilter() { 
    public boolean accept(File dir, String filename) { 
     return filename.startsWith(ipro); 
    } 
}); 
16
import org.apache.commons.io.filefilter.WildcardFileFilter; 

......... 
......... 

File dir = new File(fileDir); 
FileFilter fileFilter = new WildcardFileFilter("*.txt"); 
File[] files = dir.listFiles(fileFilter); 

Đoạn mã trên hoạt động tuyệt vời đối với tôi

2

tôi đã thực hiện giải pháp của tôi dựa trên những bài viết tôi thấy ở đây với Google. Và tôi nghĩ rằng không có hại cho việc đăng bài của tôi cũng như ngay cả khi nó là một sợi cũ.

Mã duy nhất cộng với mã này cho là nó có thể lặp qua các thư mục con.

import java.io.File; 
import java.io.FileFilter; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import org.apache.commons.io.filefilter.DirectoryFileFilter; 
import org.apache.commons.io.filefilter.WildcardFileFilter; 

Phương pháp thực hiện như sau:

List <File> exploreThis(String dirPath){ 

    File topDir = new File(dirPath); 

    List<File> directories = new ArrayList<>(); 
    directories.add(topDir); 

    List<File> textFiles = new ArrayList<>(); 

    List<String> filterWildcards = new ArrayList<>(); 
    filterWildcards.add("*.txt"); 
    filterWildcards.add("*.doc"); 

    FileFilter typeFilter = new WildcardFileFilter(filterWildcards); 

    while (directories.isEmpty() == false) 
    { 
     List<File> subDirectories = new ArrayList(); 

     for(File f : directories) 
     { 
      subDirectories.addAll(Arrays.asList(f.listFiles((FileFilter)DirectoryFileFilter.INSTANCE))); 
      textFiles.addAll(Arrays.asList(f.listFiles(typeFilter))); 
     } 

     directories.clear(); 
     directories.addAll(subDirectories); 
    } 

    return textFiles; 
} 
-2

org.apache.commons.io.FileUtils nhập khẩu;

Danh sách htmFileList = new ArrayList();

cho (File file: (danh sách) FileUtils.listFiles (new File (srcDir), new String [] { "txt", "TXT"}, true)) { htmFileList.add (file); }

Đây là mã mới nhất của tôi để thêm tất cả các file văn bản từ một thư mục

1
import java.io.IOException; 
import java.nio.file.FileSystems; 
import java.nio.file.FileVisitResult; 
import java.nio.file.Path; 
import java.nio.file.PathMatcher; 
import java.nio.file.SimpleFileVisitor; 
import java.nio.file.attribute.BasicFileAttributes; 
import java.util.ArrayList; 

public class FileFinder extends SimpleFileVisitor<Path> { 
    private PathMatcher matcher; 
    public ArrayList<Path> foundPaths = new ArrayList<>(); 

    public FileFinder(String pattern) { 
     matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern); 
    } 

    @Override 
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
     Path name = file.getFileName(); 

     if (matcher.matches(name)) { 
      foundPaths.add(file); 
     } 

     return FileVisitResult.CONTINUE; 
    } 
} 

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.LinkOption; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.ArrayList; 

public class Main { 
    public static void main(String[] args) throws IOException { 
     Path fileDir = Paths.get("files"); 
     FileFinder finder = new FileFinder("*.txt"); 
     Files.walkFileTree(fileDir, finder); 

     ArrayList<Path> foundFiles = finder.foundPaths; 

     if (foundFiles.size() > 0) { 
      for (Path path : foundFiles) { 
       System.out.println(path.toRealPath(LinkOption.NOFOLLOW_LINKS)); 
      } 
     } else { 
      System.out.println("No files were founds!"); 
     } 
    } 
} 
Các vấn đề liên quan