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

669

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

MJ
la source
8
Je suis d'accord, indiquez la classe à utiliser pour que l'affiche puisse se familiariser avec les différentes méthodes, sinon l'affiche ne prend pas la peine de lire l'API pour savoir quelles autres méthodes sont disponibles.
camickr
5
Voulez-vous dire tous les fichiers d'un dossier, ou tous les fichiers d'un dossier et tous les sous-dossiers?
Jim Garrison
3
Un lien à jour vers l'API: docs.oracle.com/javase/7/docs/api/java/io/File.html
Tom Duckering
2
Si vous utilisez Java 7 ou une version plus récente, vous pouvez utiliser Files.walkFileTree, voir stackoverflow.com/a/23814217/1115554
micha

Réponses:

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

L' API Files.walk 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 le modèle d' essai avec les ressources recommandé dans le guide de l'API. Il garantit que, quelles que soient les circonstances, le flux sera fermé.

riches
la source
10
getName()ne donnera que le nom du fichier dans son répertoire, qui pourrait être un sous-répertoire de l'original. Si vous prévoyez d'utiliser ces informations pour rechercher les fichiers, vous pouvez trouver le chemin d'accès donné par getPath()plus utile.
Tim Parenti
4
Puis-je utiliser cette méthode pour rechercher 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-elle suffisamment rapide pour être utilisée sur des systèmes contenant des milliers de fichiers ou existe-t-il une meilleure alternative?
Nitin Labhishetty
@codeln Depuis Java 8, les performances sont très acceptables, vous ne remarquez rien de décalé. Il est suffisamment rapide, efficace et lisible pour faire votre travail.
tom_mai78101
17
Dans Java 8, vous pouvez également utiliser la filterméthode. Alors forEach n'est plus nécessaire. Voir ici -> stackoverflow.com/a/26215931/1029251
Julian Pieles
3
Juste pour indiquer qu'il n'est initialisé qu'une seule fois.
riche
176
File folder = new File("/Users/you/folder/");
File[] listOfFiles = folder.listFiles();

for (File file : listOfFiles) {
    if (file.isFile()) {
        System.out.println(file.getName());
    }
}
David Robles
la source
2
Je pense que cela affichera les noms de répertoire, et pas de noms de fichiers
Fortega
1
De loin plus facile à comprendre que la réponse acceptée. +1.
sam1370
129

Dans Java 8, vous pouvez le faire

Files.walk(Paths.get("/path/to/folder"))
     .filter(Files::isRegularFile)
     .forEach(System.out::println);

qui imprimera tous les fichiers d'un dossier tout en excluant tous les répertoires. Si vous avez besoin d'une liste, ce qui suit fera:

Files.walk(Paths.get("/path/to/folder"))
     .filter(Files::isRegularFile)
     .collect(Collectors.toList())

Si vous souhaitez revenir List<File>au lieu de List<Path>simplement le mapper:

List<File> filesInFolder = Files.walk(Paths.get("/path/to/folder"))
                                .filter(Files::isRegularFile)
                                .map(Path::toFile)
                                .collect(Collectors.toList());

Vous devez également vous assurer de fermer le flux! Sinon, vous pourriez rencontrer une exception vous indiquant que trop de fichiers sont ouverts. Lisez ici pour plus d'informations.

Julian Pieles
la source
3
Obtenir une erreur avec .map (Path :: toFile) Aussi .forEach (path -> System.out.println (path.toString ()); devrait être .forEach (path -> System.out.println (path.toString ( )));
XaolingBao
2
Il dit "Référence de méthode non valide, impossible de trouver le symbole" "Méthode toFile" est-ce que toFile est censé être autre chose?
XaolingBao
2
Pouvez-vous s'il vous plaît coller votre code dans un PasteBin? Utilisez-vous java.nio.file.Path? Je viens de vérifier que la méthode toFile () devrait exister avant même java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/…
Julian Pieles
2
@NadjibMami S'il vous plaît jetez un oeil ici: razem.io/blog/posts/year2015/0819_try_catch_lambda Était à compiler pour répondre dans un commentaire. J'ai donc écrit un petit article de blog.
Julian Pieles
2
Si quelqu'un cherche toujours le sujet try catch lambda, l'url de mon blog a été modifiée -> razem.io/blog/y2015/0819_try_catch_lambda.html
Julian Pieles
26

Toutes les réponses à ce sujet qui utilisent les nouvelles fonctions Java 8 négligent de fermer le flux. L'exemple dans la réponse acceptée devrait être:

try (Stream<Path> filePathStream=Files.walk(Paths.get("/home/you/Desktop"))) {
    filePathStream.forEach(filePath -> {
        if (Files.isRegularFile(filePath)) {
            System.out.println(filePath);
        }
    });
}

Du javadoc de la Files.walkméthode:

Le flux renvoyé encapsule un ou plusieurs DirectoryStreams. Si l'élimination des ressources du système de fichiers en temps opportun est nécessaire, la construction try-with-resources doit être utilisée pour garantir que la méthode close du flux est invoquée une fois les opérations de flux terminées.

Martin
la source
Vous ne devez jamais itérer avec Stream. Vous prenez une référence Stream, l'utilisez et la retrouvez.
Rudolf Schmidt
@RudolfSchmidt vous voulez dire "jetez-le"?
Roland
1
Je veux dire que la bonne façon est de l'utiliser de cette façon: Files.walk (Paths.get ("/ home / you / Desktop")). Filter (Files :: isRegularFile) .forEach (filePath -> ...)
Rudolf Schmidt
12
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());
        }

      }
    }
  }
}
muthu krishna
la source
6
Bienvenue à ! Plutôt que de publier 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.
Martijn Pieters
D'accord, le simple fait de poster un bloc de code ne fonctionnera pas, veuillez au moins ajouter quelques commentaires dans le code ...
Ashraf.Shk786
c'est aussi du bon code, il peut aussi lire des fichiers dans des sous-répertoires d'un dossier.
Mimouni
11
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
    }
}
Sanket Thakkar
la source
Ceci est la solution pour Android lire tous les fichiers et dossiers de la carte SD ou du stockage interne.
Sanket Thakkar
10

Dans Java 7 et supérieur, vous pouvez utiliser listdir

Path dir = ...;
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
    for (Path file: stream) {
        System.out.println(file.getFileName());
    }
} catch (IOException | DirectoryIteratorException x) {
    // IOException can never be thrown by the iteration.
    // In this snippet, it can only be thrown by newDirectoryStream.
    System.err.println(x);
}

Vous pouvez également créer un filtre qui peut ensuite être passé dans la newDirectoryStreamméthode ci-dessus

DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
    public boolean accept(Path file) throws IOException {
        try {
            return (Files.isRegularFile(path));
        } catch (IOException x) {
            // Failed to determine if it's a file.
            System.err.println(x);
            return false;
        }
    }
};

Pour d'autres exemples de filtrage, [voir la documentation]. ( Http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )

Mark Spangler
la source
Je suis confus par l'exemple de création de filtre. Qu'est-ce que newDirectoryStream.Filter <Path>. Pouvez-vous montrer comment cela est déclaré?
simgineer
Je pense que je l'ai compris. c'est une faute de copier-coller. il y a un espace entre le "nouveau" et le "DirectoryStream.Filter ...". Si j'ai raison, je recommande de corriger votre exemple.
simgineer
9

Une remarque selon pour obtenir tous les fichiers du répertoire.
La méthode Files.walk(path)retournera tous les fichiers en parcourant l'arborescence de fichiers enracinée dans le fichier démarré donné.

Par exemple, il y a l'arborescence de fichiers suivante:

\---folder
    |   file1.txt
    |   file2.txt
    |
    \---subfolder
            file3.txt
            file4.txt

Utilisation de java.nio.file.Files.walk(Path):

Files.walk(Paths.get("folder"))
        .filter(Files::isRegularFile)
        .forEach(System.out::println);

Donne le résultat suivant:

folder\file1.txt
folder\file2.txt
folder\subfolder\file3.txt
folder\subfolder\file4.txt

Pour obtenir tous les fichiers uniquement dans le répertoire courant, utilisez java.nio.file.Files.list(Path):

Files.list(Paths.get("folder"))
        .filter(Files::isRegularFile)
        .forEach(System.out::println);

Résultat:

folder\file1.txt
folder\file2.txt
xxxception
la source
Cela devrait être la seule réponse à la question en ce moment en 2020 :)
Haramoz
Votez pour l' Files.listexemple. Si vous ne souhaitez pas effectuer de recherche récursive, cela peut parfois être la meilleure option.
Per Lundberg
7

Parcourez tous les fichiers à l'aide de Files.walkFileTree(Java 7)

Files.walkFileTree(Paths.get(dir), new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        System.out.println("file: " + file);
        return FileVisitResult.CONTINUE;
    }
});
micha
la source
Notez que ce code lèvera une exception (et ne signalera aucun autre fichier) si, pour certains fichiers ou répertoires, les attributs de fichier n'ont pas pu être lus, par exemple en raison d'autorisations. Facile à reproduire sur `C:`.
Thomas S.
5

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

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

Bien, Adrien

Adrien Hadj-Salah
la source
4
File directory = new File("/user/folder");      
File[] myarray;  
myarray=new File[10];
myarray=directory.listFiles();
for (int j = 0; j < myarray.length; j++)
{
       File path=myarray[j];
       FileReader fr = new FileReader(path);
       BufferedReader br = new BufferedReader(fr);
       String s = "";
       while (br.ready()) {
          s += br.readLine() + "\n";
       }
}
sailakshmi Duggirala
la source
1
Vous voudrez peut-être ajouter une explication de ce que vous essayez de réaliser, au lieu d'afficher uniquement le code. De plus, ce myarray=new File[10];n'est pas obligatoire, car il sera écrasé par la ligne suivante!
Veger
3

belle utilisation de java.io.FileFiltercomme vu sur https://stackoverflow.com/a/286001/146745

File fl = new File(dir);
File[] files = fl.listFiles(new FileFilter() {          
    public boolean accept(File file) {
        return file.isFile();
    }
});
andrej
la source
docs.oracle.com/javase/7/docs/api/java/io/… public File [] listFiles () Renvoie un tableau de noms de chemins abstraits désignant les fichiers du répertoire désigné par ce nom de chemin abstrait.
andrej du
3
    static File mainFolder = new File("Folder");
    public static void main(String[] args) {

        lf.getFiles(lf.mainFolder);
    }
    public void getFiles(File f) {
        File files[];
        if (f.isFile()) {
            String name=f.getName();

        } else {
            files = f.listFiles();
            for (int i = 0; i < files.length; i++) {
                getFiles(files[i]);
            }
        }
    }
Santosh Rathod
la source
3

Je pense que c'est un bon moyen de lire tous les fichiers d'un dossier et d'un sous-dossier

private static void addfiles (File input,ArrayList<File> files)
{
    if(input.isDirectory())
    {
        ArrayList <File> path = new ArrayList<File>(Arrays.asList(input.listFiles()));
        for(int i=0 ; i<path.size();++i)
        {
            if(path.get(i).isDirectory())
            {
                addfiles(path.get(i),files);
            }
            if(path.get(i).isFile())
            {
                files.add(path.get(i));
            }
        }
    }
    if(input.isFile())
    {
        files.add(input);
    }
}
Mohammad
la source
3

Exemple simple qui fonctionne avec Java 1.7 pour répertorier récursivement les fichiers dans les répertoires spécifiés sur la ligne de commande:

import java.io.File;

public class List {
    public static void main(String[] args) {
        for (String f : args) {
            listDir(f);
        }
    }

    private static void listDir(String dir) {
        File f = new File(dir);
        File[] list = f.listFiles();

        if (list == null) {
            return;
        }

        for (File entry : list) {
            System.out.println(entry.getName());
            if (entry.isDirectory()) {
                listDir(entry.getAbsolutePath());
            }
        }
    }
}
pdp
la source
3

Bien que je sois d'accord avec Rich, Orian et les autres pour utiliser:

    final File keysFileFolder = new File(<path>); 
    File[] fileslist = keysFileFolder.listFiles();

    if(fileslist != null)
    {
        //Do your thing here...
    }

pour une raison quelconque, tous les exemples ici utilisent un chemin absolu (c'est-à-dire tout le chemin depuis la racine, ou, disons, la lettre de lecteur (C: \) pour Windows ..)

Je voudrais ajouter qu'il est également possible d'utiliser un chemin relatif . Donc, si vous êtes pwd (répertoire / dossier actuel) est dossier1 et que vous souhaitez analyser dossier1 / sous-dossier, vous écrivez simplement (dans le code ci-dessus au lieu de):

    final File keysFileFolder = new File("subfolder");
JamesC
la source
2
package com;


import java.io.File;

/**
 *
 * @author ?Mukesh
 */
public class ListFiles {

     static File mainFolder = new File("D:\\Movies");

     public static void main(String[] args)
     {
         ListFiles lf = new ListFiles();
         lf.getFiles(lf.mainFolder);

         long fileSize = mainFolder.length();
             System.out.println("mainFolder size in bytes is: " + fileSize);
             System.out.println("File size in KB is : " + (double)fileSize/1024);
             System.out.println("File size in MB is :" + (double)fileSize/(1024*1024));
     }
     public void getFiles(File f){
         File files[];
         if(f.isFile())
             System.out.println(f.getAbsolutePath());
         else{
             files = f.listFiles();
             for (int i = 0; i < files.length; i++) {
                 getFiles(files[i]);
             }
         }
     }
}
Mukesh Jha
la source
2

Java 8 Files.walk(..)est bon quand vous êtes soore, il ne lancera pas la cause de terminaison Éviter Java 8 Files.walk (..) de (java.nio.file.AccessDeniedException) .

Voici une solution sûre, pas aussi élégante que Java 8 Files.walk(..):

int[] count = {0};
try {
    Files.walkFileTree(Paths.get(dir.getPath()), new HashSet<FileVisitOption>(Arrays.asList(FileVisitOption.FOLLOW_LINKS)),
            Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file , BasicFileAttributes attrs) throws IOException {
                    System.out.printf("Visiting file %s\n", file);
                    ++count[0];

                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFileFailed(Path file , IOException e) throws IOException {
                    System.err.printf("Visiting failed for %s\n", file);

                    return FileVisitResult.SKIP_SUBTREE;
                }

                @Override
                public FileVisitResult preVisitDirectory(Path dir , BasicFileAttributes attrs) throws IOException {
                     System.out.printf("About to visit directory %s\n", dir);
                    return FileVisitResult.CONTINUE;
                }
            });
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
GOXR3PLUS
la source
1
void getFiles(){
        String dirPath = "E:/folder_name";
        File dir = new File(dirPath);
        String[] files = dir.list();
        if (files.length == 0) {
            System.out.println("The directory is empty");
        } else {
            for (String aFile : files) {
                System.out.println(aFile);
            }
        }
    }
Subhojit Das
la source
1

Juste pour développer la réponse acceptée, je stocke les noms de fichiers dans une liste de tableaux (au lieu de simplement les vider dans System.out.println), j'ai créé une classe d'assistance "MyFileUtils" afin qu'elle puisse être importée par d'autres projets:

class MyFileUtils {
    public static void loadFilesForFolder(final File folder, List<String> fileList){
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                loadFilesForFolder(fileEntry, fileList);
            } else {
                fileList.add( fileEntry.getParent() + File.separator + fileEntry.getName() );
            }
        }
    }
}

J'ai ajouté le chemin d'accès complet au nom de fichier. Vous l'utiliseriez comme ceci:

import MyFileUtils;

List<String> fileList = new ArrayList<String>();
final File folder = new File("/home/you/Desktop");
MyFileUtils.loadFilesForFolder(folder, fileList);

// Dump file list values
for (String fileName : fileList){
    System.out.println(fileName);
}

ArrayList est passé par "value", mais la valeur est utilisée pour pointer vers le même objet ArrayList vivant dans le tas JVM. De cette façon, chaque appel récursif ajoute des noms de fichiers à la même ArrayList (nous ne créons PAS une nouvelle ArrayList à chaque appel récursif).

Salvador Valence
la source
1

Vous pouvez mettre le chemin du fichier en argument et créer une liste avec tous les chemins de fichier et ne pas la placer manuellement dans la liste. Utilisez ensuite une boucle for et un lecteur. Exemple pour les fichiers txt:

public static void main(String[] args) throws IOException{    
File[] files = new File(args[0].replace("\\", "\\\\")).listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".txt"); } });
    ArrayList<String> filedir = new ArrayList<String>();
    String FILE_TEST = null;
    for (i=0; i<files.length; i++){
            filedir.add(files[i].toString());
            CSV_FILE_TEST=filedir.get(i) 

        try(Reader testreader = Files.newBufferedReader(Paths.get(FILE_TEST));
            ){
              //write your stuff
                 }}}
Aris Mist
la source
1
package com.commandline.folder;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class FolderReadingDemo {
    public static void main(String[] args) {
        String str = args[0];
        final File folder = new File(str);
//      listFilesForFolder(folder);
        listFilesForFolder(str);
    }

    public static void listFilesForFolder(String str) {
        try (Stream<Path> paths = Files.walk(Paths.get(str))) {
            paths.filter(Files::isRegularFile).forEach(System.out::println);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

}
Manas Ranjan Mahapatra
la source
0
import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class AvoidNullExp {

public static void main(String[] args) {

    List<File> fileList =new ArrayList<>();
     final File folder = new File("g:/master");
     new AvoidNullExp().listFilesForFolder(folder, fileList);
}

    public void listFilesForFolder(final File folder,List<File> fileList) {
        File[] filesInFolder = folder.listFiles();
        if (filesInFolder != null) {
            for (final File fileEntry : filesInFolder) {
                if (fileEntry.isDirectory()) {
                    System.out.println("DIR : "+fileEntry.getName());
                listFilesForFolder(fileEntry,fileList);
            } else {
                System.out.println("FILE : "+fileEntry.getName());
                fileList.add(fileEntry);
            }
         }
        }
     }


}
ChetanTwr
la source
0

lister les fichiers du dossier Test présents dans le chemin de classe

import java.io.File;
import java.io.IOException;

public class Hello {

    public static void main(final String[] args) throws IOException {

        System.out.println("List down all the files present on the server directory");
        File file1 = new File("/prog/FileTest/src/Test");
        File[] files = file1.listFiles();
        if (null != files) {
            for (int fileIntList = 0; fileIntList < files.length; fileIntList++) {
                String ss = files[fileIntList].toString();
                if (null != ss && ss.length() > 0) {
                    System.out.println("File: " + (fileIntList + 1) + " :" + ss.substring(ss.lastIndexOf("\\") + 1, ss.length()));
                }
            }
        }


    }


}
shree
la source
0
/**
 * Function to read all mp3 files from sdcard and store the details in an
 * ArrayList
 */


public ArrayList<HashMap<String, String>> getPlayList() 
    {
        ArrayList<HashMap<String, String>> songsList=new ArrayList<>();
        File home = new File(MEDIA_PATH);

        if (home.listFiles(new FileExtensionFilter()).length > 0) {
            for (File file : home.listFiles(new FileExtensionFilter())) {
                HashMap<String, String> song = new HashMap<String, String>();
                song.put(
                        "songTitle",
                        file.getName().substring(0,
                                (file.getName().length() - 4)));
                song.put("songPath", file.getPath());

                // Adding each song to SongList
                songsList.add(song);
            }
        }
        // return songs list array
        return songsList;
    }

    /**
     * Class to filter files which have a .mp3 extension
     * */
    class FileExtensionFilter implements FilenameFilter 
    {
        @Override
        public boolean accept(File dir, String name) {
            return (name.endsWith(".mp3") || name.endsWith(".MP3"));
        }
    }

Vous pouvez filtrer n'importe quel fichier texte ou toute autre extension .. remplacez-le simplement par .MP3

Zar E Ahmer
la source
0

Il existe de nombreuses bonnes réponses ci-dessus, voici une approche différente: dans un projet maven, tout ce que vous mettez dans le dossier des ressources est copié par défaut dans le dossier target / classes. Pour voir ce qui est disponible à l'exécution

 ClassLoader contextClassLoader = 
 Thread.currentThread().getContextClassLoader();
    URL resource = contextClassLoader.getResource("");
    File file = new File(resource.toURI());
    File[] files = file.listFiles();
    for (File f : files) {
        System.out.println(f.getName());
    }

Maintenant, pour obtenir les fichiers d'un dossier spécifique, disons que vous avez un dossier appelé «res» dans votre dossier de ressources, remplacez simplement:

URL resource = contextClassLoader.getResource("res");

Si vous souhaitez avoir accès à votre package com.companyName, alors:

contextClassLoader.getResource("com.companyName");
moldave
la source
0

Cela lira les fichiers d'extension de fichier spécifiés dans le chemin d'accès donné (regarde également les sous-dossiers)

public static Map<String,List<File>> getFileNames(String 
dirName,Map<String,List<File>> filesContainer,final String fileExt){
    String dirPath = dirName;
    List<File>files = new ArrayList<>();
    Map<String,List<File>> completeFiles = filesContainer; 
    if(completeFiles == null) {
        completeFiles = new HashMap<>();
    }
    File file = new File(dirName);

    FileFilter fileFilter = new FileFilter() {
        @Override
        public boolean accept(File file) {
            boolean acceptFile = false;
            if(file.isDirectory()) {
                acceptFile = true;
            }else if (file.getName().toLowerCase().endsWith(fileExt))
              {
                acceptFile = true;
              }
            return acceptFile;
        }
    };
    for(File dirfile : file.listFiles(fileFilter)) {
        if(dirfile.isFile() && 
dirfile.getName().toLowerCase().endsWith(fileExt)) {
            files.add(dirfile);
        }else if(dirfile.isDirectory()) {
            if(!files.isEmpty()) {
                completeFiles.put(dirPath, files);  
            }

getFileNames(dirfile.getAbsolutePath(),completeFiles,fileExt);
        }
    }
    if(!files.isEmpty()) {
        completeFiles.put(dirPath, files);  
    }
    return completeFiles;
}
Katta Nagarjuna
la source
Désolé si c'est une question noob mais que dois-je passer comme files container?
Pramesh Bajracharya
0

Cela fonctionnera bien:

private static void addfiles(File inputValVal, ArrayList<File> files)
{
  if(inputVal.isDirectory())
  {
    ArrayList <File> path = new ArrayList<File>(Arrays.asList(inputVal.listFiles()));

    for(int i=0; i<path.size(); ++i)
    {
        if(path.get(i).isDirectory())
        {
            addfiles(path.get(i),files);
        }
        if(path.get(i).isFile())
        {
            files.add(path.get(i));
        }
     }

    /*  Optional : if you need to have the counts of all the folders and files you can create 2 global arrays 
        and store the results of the above 2 if loops inside these arrays */
   }

   if(inputVal.isFile())
   {
     files.add(inputVal);
   }

}
Ashraf.Shk786
la source
0

Étant donné un baseDir, répertorie tous les fichiers et répertoires en dessous, écrits de manière itérative.

    public static List<File> listLocalFilesAndDirsAllLevels(File baseDir) {

    List<File>  collectedFilesAndDirs   = new ArrayList<>();
    Deque<File> remainingDirs           = new ArrayDeque<>();

    if(baseDir.exists()) {
        remainingDirs.add(baseDir);

        while(!remainingDirs.isEmpty()) {
            File dir = remainingDirs.removeLast();
            List<File> filesInDir = Arrays.asList(dir.listFiles());
            for(File fileOrDir : filesInDir)  {
                collectedFilesAndDirs.add(fileOrDir);
                if(fileOrDir.isDirectory()) {
                    remainingDirs.add(fileOrDir);
                }
            }
        }
    }

    return collectedFilesAndDirs;
}
WillDev10
la source
-1

pour empêcher Nullpointerexceptions sur la fonction listFiles () et récupérer récursivement tous les fichiers des sous-répertoires aussi.

 public void listFilesForFolder(final File folder,List<File> fileList) {
    File[] filesInFolder = folder.listFiles();
    if (filesInFolder != null) {
        for (final File fileEntry : filesInFolder) {
            if (fileEntry.isDirectory()) {
            listFilesForFolder(fileEntry,fileList);
        } else {
            fileList.add(fileEntry);
        }
     }
    }
 }

 List<File> fileList = new List<File>();
 final File folder = new File("/home/you/Desktop");
 listFilesForFolder(folder);
muenchnair
la source