2009-09-06 127 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!"); 
     } 
    } 
}