740 votes

Comment lire tous les fichiers d'un dossier à partir de Java ?

Comment lire tous les fichiers d'un dossier avec Java ?

9 votes

Je suis d'accord, indiquez la classe à utiliser pour que le posteur puisse se familiariser avec les différentes méthodes, sinon le posteur ne prend pas la peine de lire l'API pour savoir quelles autres méthodes sont disponibles.

6 votes

Voulez-vous dire tous les fichiers d'un dossier, ou tous les fichiers d'un dossier et tous les sous-dossiers ?

3 votes

Un lien actualisé vers l'API : docs.oracle.com/javase/7/docs/api/java/io/file.html

1074voto

rich Points 3527
public void listFilesForFolder(final File folder) {
    for (final File fileEntry : folder.listFiles()) {
        if (fileEntry.isDirectory()) {
            listFilesForFolder(fileEntry);
        } else {
            System.out.println(fileEntry.getName());
        }
    }
}

final File folder = new File("/home/you/Desktop");
listFilesForFolder(folder);

Files.walk L'API est disponible à partir de Java 8.

try (Stream<Path> paths = Files.walk(Paths.get("/home/you/Desktop"))) {
    paths
        .filter(Files::isRegularFile)
        .forEach(System.out::println);
} 

L'exemple utilise essayer avec les ressources recommandé dans le guide API. Il garantit que, quelles que soient les circonstances, le flux sera fermé.

12 votes

getName() ne donnera que le nom du fichier dans son répertoire, qui peut être un sous-répertoire de l'original. Si vous prévoyez d'utiliser cette information pour trouver les fichiers, vous pouvez trouver le chemin donné par getPath() pour être plus utile.

4 votes

Puis-je utiliser cette méthode pour trouver tous les fichiers d'un type spécifique, par exemple pdf ou html, sur l'ensemble de mon système ? Ma préoccupation est l'efficacité, est-ce assez rapide pour être utilisé pour des systèmes avec des milliers de fichiers ou y a-t-il une meilleure alternative ?

0 votes

@codeln En ce qui concerne Java 8, les performances sont très acceptables, on ne remarque pas de décalage. Il est rapide, efficace et suffisamment lisible pour vous permettre de faire votre travail.

198voto

David Robles Points 4312
File folder = new File("/Users/you/folder/");
File[] listOfFiles = folder.listFiles();

for (File file : listOfFiles) {
    if (file.isFile()) {
        System.out.println(file.getName());
    }
}

2 votes

Je pense que cela imprimera les noms des répertoires, mais pas les noms de fichiers.

1 votes

De loin plus facile à comprendre que la réponse acceptée. +1.

1 votes

@sam1370 Parce que cela ne lit pas tous les fichiers du répertoire, cela ne récupère que les fichiers directement dans le répertoire donné. Si le répertoire donné contient lui-même d'autres répertoires, leur contenu ne sera pas lu.

12voto

muthu krishna Points 61
import java.io.File;

public class ReadFilesFromFolder {
  public static File folder = new File("C:/Documents and Settings/My Documents/Downloads");
  static String temp = "";

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println("Reading files under the folder "+ folder.getAbsolutePath());
    listFilesForFolder(folder);
  }

  public static void listFilesForFolder(final File folder) {

    for (final File fileEntry : folder.listFiles()) {
      if (fileEntry.isDirectory()) {
        // System.out.println("Reading files under the folder "+folder.getAbsolutePath());
        listFilesForFolder(fileEntry);
      } else {
        if (fileEntry.isFile()) {
          temp = fileEntry.getName();
          if ((temp.substring(temp.lastIndexOf('.') + 1, temp.length()).toLowerCase()).equals("txt"))
            System.out.println("File= " + folder.getAbsolutePath()+ "\\" + fileEntry.getName());
        }

      }
    }
  }
}

7 votes

Bienvenue à ! Plutôt que de poster uniquement un bloc de code, veuillez expliquer pourquoi ce code résout le problème posé. Sans explication, ce n'est pas une réponse.

0 votes

Je suis d'accord, il ne suffit pas de poster un bloc de code pour que cela fonctionne, mais il faut au moins ajouter des commentaires dans le code ...

0 votes

Ce code est aussi bon, il peut lire aussi les fichiers dans les sous-répertoires d'un dossier.

11voto

Sanket Thakkar Points 123
private static final String ROOT_FILE_PATH="/";
File f=new File(ROOT_FILE_PATH);
File[] allSubFiles=f.listFiles();
for (File file : allSubFiles) {
    if(file.isDirectory())
    {
        System.out.println(file.getAbsolutePath()+" is directory");
        //Steps for directory
    }
    else
    {
        System.out.println(file.getAbsolutePath()+" is file");
        //steps for files
    }
}

0 votes

C'est la solution pour Android de lire tous les fichiers et dossiers de la carte SD ou du stockage interne.

5voto

Adrien Hadj-Salah Points 131

Si vous voulez plus d'options, vous pouvez utiliser cette fonction qui a pour but de remplir un tableau de fichiers présents dans un dossier. Les options sont : la récursivité et le modèle à utiliser.

public static ArrayList<File> listFilesForFolder(final File folder,
        final boolean recursivity,
        final String patternFileFilter) {

    // Inputs
    boolean filteredFile = false;

    // Ouput
    final ArrayList<File> output = new ArrayList<File> ();

    // Foreach elements
    for (final File fileEntry : folder.listFiles()) {

        // If this element is a directory, do it recursivly
        if (fileEntry.isDirectory()) {
            if (recursivity) {
                output.addAll(listFilesForFolder(fileEntry, recursivity, patternFileFilter));
            }
        }
        else {
            // If there is no pattern, the file is correct
            if (patternFileFilter.length() == 0) {
                filteredFile = true;
            }
            // Otherwise we need to filter by pattern
            else {
                filteredFile = Pattern.matches(patternFileFilter, fileEntry.getName());
            }

            // If the file has a name which match with the pattern, then add it to the list
            if (filteredFile) {
                output.add(fileEntry);
            }
        }
    }

    return output;
}

Best, Adrien

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X