Как прочитать все файлы в папке с Java?


669

Как прочитать все файлы в папке через Java?


8
Я согласен, укажите класс для использования, чтобы автор мог ознакомиться с различными методами, в противном случае он не будет читать API, чтобы узнать, какие другие методы доступны.
camickr

5
Вы имели в виду все файлы в папке или все файлы в папке и всех подпапках?
Джим Гаррисон

3
Обновленная ссылка на API: docs.oracle.com/javase/7/docs/api/java/io/File.html
Том Дакеринг,

2
Если вы используете Java 7 или более позднюю версию вы можете использовать Files.walkFileTree, см stackoverflow.com/a/23814217/1115554
Micha

Ответы:


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

API Files.walk доступен из Java 8.

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

В примере используется шаблон try-with-resources , рекомендованный в руководстве по API. Это гарантирует, что независимо от обстоятельств поток будет закрыт.


10
getName()даст только имя файла в его каталоге, который может быть подкаталогом оригинала. Если вы планируете использовать эту информацию для поиска файлов, возможно, вам getPath()будет полезен указанный путь .
Тим Паренти

4
Могу ли я использовать этот метод, чтобы найти все файлы определенного типа, например pdf или html, по всей моей системе? Меня беспокоит эффективность, достаточно ли она быстра для систем с тысячами файлов или есть лучшая альтернатива?
Nitin Labhishetty

@codeln Начиная с Java 8, производительность очень приемлемая, вы не заметите ничего запоздалого. Он быстрый, эффективный и достаточно читабельный, чтобы выполнить свою работу.
tom_mai78101

17
В Java 8 вы также можете использовать этот filterметод. Тогда forEach больше не нужен. Смотрите здесь -> stackoverflow.com/a/26215931/1029251
Джулиан Пилес

3
Просто чтобы указать, что это только инициализировано один раз.
Богатый

176
File folder = new File("/Users/you/folder/");
File[] listOfFiles = folder.listFiles();

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

2
Я думаю, что это напечатает имена каталогов, а не имена файлов
Fortega

1
Гораздо проще понять, чем принятый ответ. +1.
sam1370

129

В Java 8 вы можете сделать это

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

который напечатает все файлы в папке, исключая все каталоги. Если вам нужен список, сделайте следующее:

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

Если вы хотите вернуться List<File>вместо того, чтобы List<Path>просто отобразить это:

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

Вы также должны обязательно закрыть поток! В противном случае вы можете столкнуться с исключением, сообщающим, что открыто слишком много файлов. Читайте здесь для получения дополнительной информации.


3
Получение ошибки с .map (Path :: toFile) Также .forEach (путь -> System.out.println (path.toString ()); должен быть .forEach (путь -> System.out.println (path.toString ( )));
XaolingBao

2
Там написано: «Недопустимая ссылка на метод, не удается найти символ». «Метод toFile» должен ли toFile быть чем-то другим?
XaolingBao

2
Можете ли вы вставить свой код в PasteBin? Вы используете java.nio.file.Path? Я только что проверил, что метод toFile () должен существовать даже до java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/…
Джулиан Пилес,

2
@NadjibMami Пожалуйста, посмотрите здесь: razem.io/blog/posts/year2015/0819_try_catch_lambda Был составлен, чтобы ответить в комментарии. Поэтому я написал краткое сообщение в блоге.
Джулиан Пилес

2
Если кто-то все еще ищет тему «Попробуй поймать лямбду», URL моего блога был изменен -> razem.io/blog/y2015/0819_try_catch_lambda.html
Джулиан Пилес

26

Все ответы на эту тему, в которых используются новые функции Java 8, пренебрегают закрытием потока. Пример в принятом ответе должен быть:

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

Из javadoc Files.walkметода:

Возвращенный поток инкапсулирует один или несколько DirectoryStreams. Если требуется своевременное удаление ресурсов файловой системы, следует использовать конструкцию try-with-resources, чтобы гарантировать, что метод close потока вызывается после завершения потоковых операций.


Вы никогда не должны повторяться с Stream. Вы берете ссылку на поток, используете его и через него прочь.
Рудольф Шмидт

@RudolfSchmidt ты имеешь в виду "выбросить"?
Роланд

1
Я имею в виду, что правильно использовать это следующим образом: Files.walk (Paths.get ("/ home / you / Desktop")). Filter (Files :: isRegularFile) .forEach (filePath -> ...)
Рудольф Шмидт

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

      }
    }
  }
}

6
Добро пожаловать в ! Вместо того, чтобы только публиковать блок кода, пожалуйста, объясните, почему этот код решает поставленную проблему. Без объяснения это не ответ.
Мартин Питерс

Согласен, просто опубликовать блок кода не получится. По крайней мере, добавьте несколько комментариев в код ...
Ashraf.Shk786

Это хороший код, он также может читать файлы в подкаталогах папки.
Мимуни

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

Это решение для Android для чтения всех файлов и папок с SDCard или внутренней памяти.
Санкет Тхаккар

10

В Java 7 и выше вы можете использовать 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);
}

Вы также можете создать фильтр, который затем может быть передан в newDirectoryStreamметод выше

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

Для других примеров фильтрации [см. Документацию]. ( Http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )


Я смущен примером создания фильтра. Что такое newDirectoryStream.Filter <Path>. Можете ли вы показать, как это заявлено?
simgineer

Я думаю, что я понял это. это копия и вставка опечатка. между "новым" и "DirectoryStream.Filter ..." есть пробел. Если я прав, рекомендую исправить ваш пример.
simgineer

9

Одно замечание по получению всех файлов в каталоге.
МетодFiles.walk(path) вернет все файлы, пройдясь по дереву файлов с корнем в данном запущенном файле.

Например, есть следующее дерево файлов:

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

Используя java.nio.file.Files.walk(Path):

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

Дает следующий результат:

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

Чтобы получить все файлы только в текущем каталоге, используйте java.nio.file.Files.list(Path):

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

Результат:

folder\file1.txt
folder\file2.txt

Это должен быть единственный ответ, оставленный на вопрос прямо сейчас в 2020 году :)
Харамоз

Upvote для Files.listпримера. Если вы не хотите выполнять рекурсивный поиск, иногда это может быть лучшим вариантом.
За Лундберг

7

Просто пройдите все файлы, используя 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;
    }
});

Обратите внимание, что этот код будет генерировать исключение (и не сообщать о каких-либо дополнительных файлах), если для какого-либо файла или каталога атрибуты файла не могут быть прочитаны, например, из-за разрешений. Легко воспроизвести на `C:`.
Томас С.

5

Если вам нужны дополнительные параметры, вы можете использовать эту функцию, которая предназначена для заполнения массива файлов, присутствующих в папке. Варианты: рекурсивность и шаблон для соответствия.

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

Бест, Адриен


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

1
Возможно, вы захотите добавить объяснение того, чего вы пытаетесь достичь, вместо того, чтобы показывать только код. Кроме того, myarray=new File[10];не требуется, так как будет перезаписано следующей строкой!
Вегер

3

хорошее использование, java.io.FileFilterкак видно на 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();
    }
});

docs.oracle.com/javase/7/docs/api/java/io/… public File [] listFiles () Возвращает массив абстрактных путей, обозначающих файлы в каталоге, обозначенном этим абстрактным путем.
Андрей

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

3

Я думаю, что это хороший способ прочитать все файлы в папке и подпапке

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

3

Простой пример, который работает с Java 1.7 для рекурсивного перечисления файлов в каталогах, указанных в командной строке:

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

3

Хотя я согласен с Ричем, Орианом и остальными за использование:

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

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

по какой-то причине во всех примерах здесь используется абсолютный путь (т. е. весь путь от root или, скажем, буква диска (C: \) для Windows ..)

Я хотел бы добавить, что можно также использовать относительный путь. Итак, если вы pwd (текущая директория / папка) - это папка folder1 и вы хотите проанализировать вложенную папку folder1 /, вы просто пишете (в приведенном выше коде вместо):

    final File keysFileFolder = new File("subfolder");

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

2

Java 8 Files.walk(..)хороша, когда вы недовольны, она не будет выбрасывать Avoid Java 8 Files.walk (..) причина завершения (java.nio.file.AccessDeniedException) .

Вот безопасное решение, не столь элегантное, как 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();
}

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

1

Просто чтобы расширить принятый ответ, я сохраняю имена файлов в ArrayList (вместо того, чтобы просто выгружать их в System.out.println), я создал вспомогательный класс «MyFileUtils», чтобы он мог быть импортирован другими проектами:

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

Я добавил полный путь к имени файла. Вы бы использовали это так:

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 передается значением «value», но значение используется для указания на тот же объект ArrayList, который находится в куче JVM. Таким образом, каждый рекурсивный вызов добавляет имена файлов в один и тот же ArrayList (мы НЕ создаем новый ArrayList для каждого рекурсивного вызова).


1

Вы можете указать путь к файлу в качестве аргумента и создать список со всеми путями к файлам, но не указывать его вручную. Затем используйте цикл for и читатель. Пример для текстовых файлов:

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

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

}

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


}

0

список файлов из тестовой папки, присутствующих в пути к классам

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


    }


}

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

Вы можете отфильтровать любые текстовые файлы или любое другое расширение. Просто замените его на .MP3


0

Есть много хороших ответов выше, вот другой подход: В проекте maven все, что вы помещаете в папку ресурсов, по умолчанию копируется в папку target / classes. Чтобы увидеть, что доступно во время выполнения

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

Теперь, чтобы получить файлы из определенной папки, скажем, у вас есть папка с именем res в папке ресурсов, просто замените:

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

Если вы хотите иметь доступ к пакету com.companyName, тогда:

contextClassLoader.getResource("com.companyName");

0

Это будет читать указанные файлы расширений файлов по указанному пути (также ищет подпапки)

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

Извините, если это нубский вопрос, но что я должен передать как files container?
Прамеш Баджрачарья

0

Это будет хорошо работать:

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

}

0

Имея baseDir, перечисляет все файлы и каталоги под ним, написанные итеративно.

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

-1

чтобы исключить Nullpointerexceptions в функции listFiles () и рекурсивно получить все файлы из подкаталогов.

 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);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.