Como ler todos os arquivos em uma pasta do Java?

669

Como ler todos os arquivos em uma pasta através do Java?

MJ
fonte
8
Concordo, aponte a classe a ser usada para que o pôster possa se familiarizar com os vários métodos; caso contrário, o pôster não se preocupa em ler a API para descobrir quais outros métodos estão disponíveis.
camickr
5
Você quis dizer todos os arquivos em uma pasta ou todos os arquivos em uma pasta e todas as subpastas?
21411 Jim Garrison
3
Um link atualizado para a API: docs.oracle.com/javase/7/docs/api/java/io/File.html
Tom Duckering
2
Se você estiver usando Java 7 ou mais novo você pode usar Files.walkFileTree, consulte stackoverflow.com/a/23814217/1115554
micha

Respostas:

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

A API Files.walk está disponível no Java 8.

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

O exemplo usa o padrão try-with-resources recomendado no guia da API. Ele garante que, independentemente das circunstâncias, o fluxo será fechado.

rico
fonte
10
getName()fornecerá apenas o nome do arquivo em seu diretório, que pode ser um subdiretório do original. Se você planeja usar essas informações para encontrar os arquivos, pode achar que o caminho fornecido getPath()é mais útil.
precisa saber é o seguinte
4
Posso usar esse método para encontrar todos os arquivos de um tipo específico, como pdf ou html em todo o sistema? Minha preocupação é eficiência, é rápido o suficiente para ser usado em sistemas com milhares de arquivos ou existe uma alternativa melhor?
Nitin Labhishetty 10/03/2014
@codeln No Java 8, o desempenho é muito aceitável, você não percebe nada em atraso. É rápido, eficiente e legível o suficiente para fazer seu trabalho.
tom_mai78101
17
No Java 8, você também pode fazer uso do filtermétodo Então forEach não é mais necessário. Veja aqui -> stackoverflow.com/a/26215931/1029251
Julian Pieles
3
Apenas para indicar que ele foi inicializado apenas uma vez.
rica
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
fonte
2
Acho que isso vai imprimir os nomes de diretório, e não nomes de arquivos
Fortega
1
Muito mais fácil de entender do que a resposta aceita. +1.
sam1370
129

No Java 8, você pode fazer isso

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

que imprimirá todos os arquivos em uma pasta enquanto exclui todos os diretórios. Se você precisar de uma lista, fará o seguinte:

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

Se você deseja retornar em List<File>vez de List<Path>apenas mapeá-lo:

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

Você também precisa fechar o fluxo! Caso contrário, você poderá encontrar uma exceção informando que muitos arquivos estão abertos. Leia aqui para mais informações.

Julian Pieles
fonte
3
Obtendo um erro com .map (Path :: toFile) Também .forEach (caminho -> System.out.println (path.toString ()); deve ser .forEach (caminho -> System.out.println (path.toString ( )););
XaolingBao
2
Diz "Referência de método inválida, não é possível encontrar o símbolo" "O método toFile" é toFile que deveria ser outra coisa?
XaolingBao
2
Você pode colar seu código em um PasteBin? Você está usando java.nio.file.Path? Acabei de verificar o método TOFILE () deve existir mesmo antes de java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/...
Julian Pieles
2
@NadjibMami Dê uma olhada aqui: razem.io/blog/posts/year2015/0819_try_catch_lambda Foi compilado para responder em um comentário. Então eu escrevi um post rápido no blog.
Julian Pieles
2
Se alguém ainda estiver procurando pelo tópico try catch lambda, o URL do meu blog foi alterado -> razem.io/blog/y2015/0819_try_catch_lambda.html
Julian Pieles
26

Todas as respostas neste tópico que utilizam as novas funções do Java 8 estão negligenciando o fechamento do fluxo. O exemplo na resposta aceita deve ser:

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

No javadoc do Files.walkmétodo:

O fluxo retornado encapsula um ou mais DirectoryStreams. Se o descarte oportuno dos recursos do sistema de arquivos for necessário, a construção try-with-resources deve ser usada para garantir que o método de fechamento do fluxo seja chamado após a conclusão das operações do fluxo.

Martin
fonte
Você nunca deve iterar com o Stream. Você pega uma referência de Stream, usa-a e passa por ela.
Rudolf Schmidt
@RudolfSchmidt você quer dizer "jogar fora"?
Roland
1
Quero dizer que a maneira correta é usá-lo dessa maneira: 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
fonte
6
Bem-vindo ao ! Em vez de publicar apenas um bloco de código, explique por que esse código resolve o problema apresentado. Sem uma explicação, isso não é uma resposta.
Martijn Pieters
Concordado, Apenas postar um bloco de código não funcionará, por favor, pelo menos, adicione alguns comentários no código ... #
Ashraf.Shk786 #
como esse código é bom, ele também pode ler arquivos em subdiretórios de uma pasta.
18719
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
fonte
Esta é a solução para o Android ler todos os arquivos e pastas do cartão SD ou armazenamento interno.
Sanket Thakkar
10

No Java 7 e superior, você pode usar 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);
}

Você também pode criar um filtro que pode ser passado para o diretório newDirectoryStream método acima

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

Para outros exemplos de filtragem, consulte a documentação ( http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )

Mark Spangler
fonte
Estou confuso com o exemplo de filtro de criação. O que é newDirectoryStream.Filter <caminho>. Você pode mostrar como isso é declarado?
Simgineer
Eu acho que descobri. é um erro de copiar e colar. existe um espaço entre o "novo" e o "DirectoryStream.Filter ...". Se eu estiver certo, recomendo corrigir o seu exemplo.
Simgineer
9

Uma observação para obter todos os arquivos no diretório
O método Files.walk(path)retornará todos os arquivos percorrendo a árvore de arquivos enraizada no arquivo inicial fornecido.

Por exemplo, existe a próxima árvore de arquivos:

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

Usando o java.nio.file.Files.walk(Path):

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

Dá o seguinte resultado:

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

Para obter todos os arquivos apenas no diretório atual, use o java.nio.file.Files.list(Path):

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

Resultado:

folder\file1.txt
folder\file2.txt
xxxception
fonte
Esta deve ser a única resposta que resta para a pergunta agora em 2020 :)
Haramoz
Voto positivo para o Files.listexemplo. Se você não deseja pesquisar recursivamente, essa pode ser a melhor opção algumas vezes.
Por Lundberg
7

Basta percorrer todos os arquivos usando 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
fonte
Observe que esse código lançará uma exceção (e não reportará nenhum arquivo adicional) se, para algum arquivo ou diretório, os atributos do arquivo não puderem ser lidos, por exemplo, devido a permissões. Fácil de reproduzir em `C:`.
Thomas S.
5

Se você quiser mais opções, poderá usar esta função que visa preencher uma lista de matriz de arquivos presentes em uma pasta. As opções são: recursividade e padrão a serem correspondidos.

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

Adrien Best

Adrien Hadj-Salah
fonte
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
fonte
1
Você pode adicionar uma explicação sobre o que está tentando obter, em vez de mostrar apenas o código. Além disso, myarray=new File[10];não é necessário, pois será substituído pela próxima linha!
Veger
3

bom uso de java.io.FileFiltercomo visto em 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
fonte
docs.oracle.com/javase/7/docs/api/java/io/… Arquivo público [] listFiles () Retorna uma matriz de nomes de caminho abstratos que indicam os arquivos no diretório indicado por esse nome de caminho abstrato.
andrej
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
fonte
3

Eu acho que essa é uma boa maneira de ler todos os arquivos em uma pasta e subpasta

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
fonte
3

Exemplo simples que funciona com o Java 1.7 para listar recursivamente os arquivos nos diretórios especificados na linha de comandos:

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
fonte
3

Embora eu concorde com Rich, Orian e o restante em usar:

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

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

por alguma razão, todos os exemplos aqui usam absoluto caminho (ou seja, desde o raiz ou, digamos, a letra da unidade (C: \) para o Windows ..)

Eu gostaria de acrescentar que também é possível usar o caminho relativo . Portanto, se você é pwd (diretório / pasta atual) é folder1 e deseja analisar folder1 / subpasta, basta escrever (no código acima, em vez de):

    final File keysFileFolder = new File("subfolder");
JamesC
fonte
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
fonte
2

O Java 8 Files.walk(..)é bom quando você está navegando, mas não lançará a causa de terminação Evite o Java 8 Files.walk (..) da (java.nio.file.AccessDeniedException) .

Aqui está uma solução segura, embora não tão elegante quanto o 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
fonte
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
fonte
1

Apenas para expandir a resposta aceita, armazenei os nomes de arquivos em um ArrayList (em vez de apenas despejá-los no System.out.println), criei uma classe auxiliar "MyFileUtils" para que pudesse ser importada por outros projetos:

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

Eu adicionei o caminho completo ao nome do arquivo. Você usaria assim:

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

O ArrayList é passado por "value", mas o valor é usado para apontar para o mesmo objeto ArrayList que vive no Heap da JVM. Dessa forma, cada chamada de recursão adiciona nomes de arquivos à mesma ArrayList (NÃO estamos criando uma nova ArrayList em cada chamada recursiva).

Salvador Valencia
fonte
1

Você pode colocar o caminho do arquivo em argumento e criar uma lista com todos os caminhos de arquivo, e não a lista manualmente. Em seguida, use um loop for e um leitor. Exemplo para arquivos 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
fonte
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
fonte
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
fonte
0

listar arquivos da pasta Test presentes no caminho da 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
fonte
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"));
        }
    }

Você pode filtrar qualquer arquivo de texto ou qualquer outra extensão. Apenas substitua-o por .MP3

Jawad Zeb
fonte
0

Há muitas boas respostas acima, eis uma abordagem diferente: em um projeto de maven, tudo o que você coloca na pasta de recursos é copiado por padrão na pasta de destino / classes. Para ver o que está disponível em tempo de execução

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

Agora, para obter os arquivos de uma pasta específica, digamos que você tenha uma pasta chamada 'res' na sua pasta de recursos, basta substituir:

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

Se você deseja ter acesso ao seu pacote com.companyName, então:

contextClassLoader.getResource("com.companyName");
moldavo
fonte
0

Isso lerá arquivos de extensão de arquivo especificados no caminho especificado (também parece com subpastas)

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
fonte
Desculpe se isso é uma pergunta noob, mas o que devo passar como um files container?
Pramesh Bajracharya
0

Isso funcionará bem:

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
fonte
0

Dado um baseDir, lista todos os arquivos e diretórios abaixo dele, escritos iterativamente.

    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
fonte
-1

para impedir Nexpointerexceptions na função listFiles () e obter recursivamente todos os arquivos de subdiretórios também.

 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
fonte