2009-09-06 7 views
45

¿Hay un código Java incorporado que analizará una carpeta determinada y lo buscará en los archivos .txt?Java: encuentre archivos .txt en la carpeta especificada

+2

Podría ser la respuesta será plataforma específica? – Milhous

+0

Vea también http://stackoverflow.com/questions/794381/how-to-find-files-that-match-a-wildcard-string-in-java – Vadzim

+5

Esta es una pregunta real. Si fuera tan difícil de entender como sería necesario para ser cerrado, entonces no habría una respuesta que no solo responda la pregunta a la perfección, sino que también tenga 89 votaciones ascendentes. – SpaceCore186

Respuesta

110

Usted puede utilizar el método listFiles() proporcionada por la clase 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, esto funciona bien para mí, al menos para los casos de prueba simples que he probado. 36 personas parecen estar de acuerdo. ¿De qué manera no funciona para ti? – djna

20

Probar:

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

¿Quieres hacer una búsqueda que ignore en cuyo caso:

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

Si desea buscar de forma recursiva a través de un árbol de directorios para archivos de texto, debe ser capaz de adaptar lo anterior como una función recursiva o una función iterativa utilizando una pila.

+0

Se ve bien. Déjame probar esto ... – Sri

-2

Aquí es mi plataforma de código específico (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

¿Por qué alguien querría usar esto cuando hay disponible una solución multiplataforma mucho más fácil? – BlueSilver

+0

Una razón para usar una versión nativa es evitar leer una gran lista de archivos en un directorio largo. En Java 6, la clase 'java.io.File' no incluye métodos que leen los archivos en un directorio como una secuencia o utilizando un iterador. Las implementaciones de Java 6 de 'File.listFiles (FileFilter)' y 'File.listFiles (FilenameFilter) 'ambos primero leen todos los archivos de un directorio y luego aplican el filtro. Cuando se encuentra con un directorio que contiene millones de archivos, por ejemplo, 'File.listFiles' puede leer tantos archivos que puede consumir toda la memoria del montón en la JVM. –

+0

Consulte http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/21487ef30163/src/share/classes/java/io/File.java para la implementación de 'File.listFiles (FileFilter)'. –

6

Es realmente útil, lo usé con un ligero cambio:

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

El código anterior funciona muy bien para mí

2

hice mi solución basada en los mensajes que he encontrado aquí con Google. Y pensé que no había daño publicar el mío también, incluso si se trata de un hilo viejo.

La única ventaja que brinda este código es que también puede iterar a través de subdirectorios.

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; 

método es como sigue:

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 importación;

Lista htmFileList = new ArrayList();

para (del archivo: (Lista) FileUtils.listFiles (nuevo archivo (SRCDIR), nuevo String [] { "txt", "TXT"}, true)) { htmFileList.add (archivo); }

Este es mi último código para añadir todos los archivos de texto desde un directorio

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