2009-09-06 9 views
45

Gibt es einen eingebauten Java-Code, der einen bestimmten Ordner analysiert und nach .txt Dateien sucht?Java: Finden Sie TXT-Dateien im angegebenen Ordner

+2

Könnte Antwort hinzufügen Plattform spezifisch? – Milhous

+0

Siehe auch http://stackoverflow.com/questions/794381/how-to-find-files-that-match-a-wildcard-string-in-java – Vadzim

+5

Dies ist eine echte Frage. Wenn es so schwer zu verstehen wäre, wie es sein müsste, um geschlossen zu sein, dann würde es keine Antwort geben, die nicht nur die Frage perfekt beantwortet, sondern auch 89 Upvotes hat. – SpaceCore186

Antwort

110

können Sie die listFiles() Methode der java.io.File-Klasse verwenden.

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, das funktioniert für mich ganz gut, zumindest für die einfachen Testfälle, die ich ausprobiert habe. 36 Leute scheinen mir zuzustimmen. Inwiefern funktioniert es nicht für dich? – djna

20

Versuchen:

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

Sie wollen in diesem Fall ein Groß- und Kleinschreibung Suche tun:

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

Wenn Sie rekursiv nach durch einen Verzeichnisbaum für Textdateien suchen wollen, sollten Sie sein fähig, das Obige entweder als eine rekursive Funktion oder eine iterative Funktion unter Verwendung eines Stapels anzupassen.

+0

Sieht gut aus. Lassen Sie mich das versuchen. – Sri

-2

Hier ist meine Plattform-spezifischen Code (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

Warum sollte jemand das verwenden wollen, wenn es eine viel einfachere, plattformübergreifende Lösung gibt? – BlueSilver

+0

Ein Grund, eine native Version zu verwenden, besteht darin, das Lesen einer großen Liste von Dateien in einem langen Verzeichnis zu vermeiden. In Java 6 enthält die Klasse 'java.io.File' keine Methoden, die Dateien in einem Verzeichnis als Stream lesen oder einen Iterator verwenden. Die Java 6-Implementierungen von 'File.listFiles (FileFilter)' und 'File.listFiles (FilenameFilter) 'liest zuerst alle Dateien aus einem Verzeichnis und wendet dann den Filter an. Wenn beispielsweise ein Verzeichnis mit Millionen von Dateien gefunden wird, kann 'File.listFiles' so viele Dateien lesen, dass es möglicherweise den gesamten Heap-Speicher in der JVM verbraucht. –

+0

Siehe http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/21487ef30163/src/share/classes/java/io/File.java für die Implementierung von 'File.listFiles (FileFilter)'. –

6

Es ist wirklich nützlich, habe ich es mit einer kleinen Änderung:

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

Der Code funktioniert über großartig für mich

2

ich meine Lösung auf den Pfosten gemacht basierend gefunden hier mit Google. Und ich dachte, es schadet nichts, auch wenn es ein alter Thread ist.

Das einzige Plus dieses Codes ist, dass es auch durch Unterverzeichnisse iterieren kann.

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; 

Verfahren ist wie folgt: Import org.apache.commons.io.FileUtils

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

;

Liste htmFileList = new ArrayList();

für (Datei: (List) FileUtils.listFiles (neue Datei (srcdir), neuer String [] { "txt", "TXT"}, true)) { htmFileList.add (Datei); }

Dies ist mein letzter Code alle Textdateien aus einem Verzeichnis seine

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