2009-09-06 62 views
45

是否有內置的Java代碼將解析給定的文件夾並在.txt文件中搜索它?Java:在指定文件夾中查找.txt文件

+2

添加的所有文本文件都可以回答是特定於平臺我最新的代碼? – Milhous 2009-09-06 05:51:59

+0

另請參閱http://stackoverflow.com/questions/794381/how-to-find-files-that-match-a-wildcard-string-in-java – Vadzim 2015-07-28 19:04:22

+5

這是一個真正的問題。如果它很難理解,因爲它需要被關閉,那麼就不會有一個答案,它不僅能夠完美地回答這個問題,而且還有89個贊同。 – SpaceCore186 2016-09-04 21:40:19

回答

110

您可以使用由java.io.File類提供的listFiles()方法。

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,這對我來說工作得很好,至少對於我試過的簡單測試用例。 36人似乎同意。它不適合你的方式? – djna 2013-03-17 22:25:45

20

嘗試:

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; 
} 

你想要做一個不區分大小寫在這種情況下:

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

如果你想通過文本文件的目錄樹遞歸搜索,你應該能夠將上述內容作爲遞歸函數或使用堆棧的迭代函數來適應。

+0

看起來不錯。讓我試試這個.. – Sri 2009-09-06 06:03:07

-2

這裏是我的平臺相關的代碼(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

爲什麼任何人都希望在有更簡單的跨平臺解決方案時使用它? – BlueSilver 2011-12-06 15:14:28

+0

使用本地版本的一個原因是避免讀取長目錄中的大量文件列表。在Java 6中,類java.io.File不包含以流或迭代器的形式讀取目錄中的文件的方法。 File.listFiles(FileFilter)和File的Java 6實現。listFiles(FilenameFilter)'首先從目錄中讀取所有文件,然後應用過濾器。例如,在遇到包含數百萬個文件的目錄時,「File.listFiles」可能會讀取很多文件,以至於它可能會佔用JVM中的所有堆內存。 – 2013-02-26 12:28:52

+0

請參閱http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/21487ef30163/src/share/classes/java/io/File.java以獲得'File.listFiles(FileFilter)'的實現。 – 2013-02-26 12:29:37

6

它真的有用,我有輕微的變化用它:

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); 

上面的代碼的偉大工程,爲我

2

我做了基於我發現帖子我的解決辦法在這裏與谷歌。而且我認爲即使它是舊線程也不會傷害我的郵件。

此代碼的唯一優點是它也可以遍歷子目錄。

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; 

方法如下:

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;

List htmFileList = new ArrayList();

爲(文件的文件:(列表)FileUtils.listFiles(新文件(SRCDIR),新的String [] { 「TXT」, 「TXT」}, 真)){ htmFileList.add(文件); }

這是從目錄

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!"); 
     } 
    } 
}