2009-09-06 15 views
45

Czy istnieje wbudowany kod Java, który przeanalizuje dany folder i przeszuka go pod kątem plików .txt?Java: Znajdź pliki .txt w określonym folderze

+2

Mogłoby być odpowiedź platforma konkretnego? – Milhous

+0

Zobacz także http://stackoverflow.com/questions/794381/how-to-find-files-that-match-a-wildcard-string-in-java – Vadzim

+5

To jest prawdziwe pytanie. Gdyby tak trudno było zrozumieć, jak musiałoby być zamknięte, to nie byłoby odpowiedzi, która nie tylko doskonale odpowie na to pytanie, ale także ma 89 przegranych. – SpaceCore186

Odpowiedz

110

Można użyć metody listFiles() przewidzianej przez klasę 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, to działa dla mnie dobrze, przynajmniej dla prostych przypadków testowych, których próbowałem. 36 osób wydaje się zgadzać. W jaki sposób to nie działa? – djna

20

Spróbuj:

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

Chcesz zrobić szafkowy niewrażliwe wyszukiwania w takim przypadku:

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

Jeśli chcesz rekursywnie szukać poprzez drzewa katalogów dla plików tekstowych, powinno być w stanie dostosować powyższe jako funkcję rekurencyjną lub funkcję iteracyjną za pomocą stosu.

+0

Wygląda dobrze. Pozwól mi wypróbować to ... – Sri

-2

Oto mój kod konkretnej platformy (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

Dlaczego ktoś chciałby użyć tego, gdy jest dostępne znacznie łatwiejsze, wieloplatformowe rozwiązanie? – BlueSilver

+0

Jednym z powodów używania natywnej wersji jest unikanie czytania ogromnej listy plików w długim katalogu. W Javie 6 klasa 'java.io.File' nie zawiera metod, które odczytują pliki w katalogu jako strumień lub za pomocą iteratora. Implementacje Java 6 'File.listFiles (FileFilter)' i 'Plik.listFiles (FilenameFilter) 'najpierw odczytuje wszystkie pliki z katalogu, a następnie stosuje filtr. Po znalezieniu katalogu zawierającego miliony plików, na przykład 'File.listFiles' może odczytać tak wiele plików, że może zużywać całą pamięć sterty w JVM. –

+0

Zobacz http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/21487ef30163/src/share/classes/java/io/File.java dla implementacji 'File.listFiles (FileFilter)'. –

6

Jest to bardzo przydatne, użyłem go z niewielką zmianą:

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

Powyższy kod działa dla mnie świetnie

2

Zrobiłem rozwiązanie oparte na słupkach znalazłem tutaj z Google. I pomyślałem, że nie ma nic złego w publikowaniu, nawet jeśli jest to stara nitka.

Jedynym plusem tego kodu jest możliwość iteracji poprzez podkatalogi.

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; 

sposób jest następujący:

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

Lista htmFileList = new ArrayList();

dla (Plik: (lista) FileUtils.listFiles (nowy plik (SRCDIR), new String [] { "txt", "TXT"}, true)) { htmFileList.add (plik); }

To jest mój ostatni kod, aby dodać wszystkie pliki tekstowe z katalogu

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!"); 
     } 
    } 
} 
Powiązane problemy