2009-09-06 2 views
45

Есть ли встроенный Java-код, который будет анализировать данную папку и искать ее для файлов .txt?Java: Найти .txt файлы в указанной папке

+2

Может быть ответом будет конкретной платформы? – Milhous

+0

См. Также http://stackoverflow.com/questions/794381/how-to-find-files-that-match-a-wildcard-string-in-java – Vadzim

+5

Это настоящий вопрос. Если бы это было так трудно понять, как нужно было бы закрыться, тогда не было бы ответа, который бы не только полностью отвечал на вопрос, но также имел 89 верхних позиций. – SpaceCore186

ответ

110

Вы можете использовать listFiles() метод предоставленных 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, это работает для меня просто отлично, по крайней мере, для простых тестовых примеров, которые я пробовал. 36 человек, похоже, согласны. Каким образом это не работает для вас? – djna

20

Try:

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

-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

+0

Одна из причин использования родной версии - избежать чтения огромного списка файлов в длинном каталоге. В Java 6 класс 'java.io.File' не включает методы, которые читают файлы в каталоге как поток или используют итератор. Реализации Java 6 «File.listFiles (FileFilter)» и «Файл».listFiles (FilenameFilter) 'оба сначала считывают все файлы из каталога, а затем применяют фильтр. Когда вы сталкиваетесь с каталогом, содержащим миллионы файлов, например, «File.listFiles» может читать так много файлов, что он может потреблять всю кучу памяти в JVM. –

+0

См. Http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/21487ef30163/src/share/classes/java/io/File.java для реализации 'File.listFiles (FileFilter)'. –

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

Я сделал мое решение на основе сообщений, которые я нашел здесь с Google. И я подумал, что не стоит наносить ущерб и моим, даже если это старая нить.

Единственный плюс, который дает этот код, заключается в том, что он может выполнять итерацию через подкаталоги.

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;

Список htmFileList = новый ArrayList();

для (Файл: (список) FileUtils.listFiles (новый файл (SRCDIR), новый String [] { "текстовый", "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!"); 
     } 
    } 
} 
Смежные вопросы