Як читати всі файли в папці з Java?


669

Як прочитати всі файли в папці через Java?


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

5
Ви мали на увазі всі файли в папці або всі файли в папці та всі підпапки?
Джим Гаррісон


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

У прикладі використовується схема пробних ресурсів, рекомендована в посібнику по API. Це гарантує, що незалежно від обставин потік буде закритий.


10
getName()дасть лише ім'я файлу у своєму каталозі, яке може бути підкаталогом оригіналу. Якщо ви плануєте використовувати цю інформацію для пошуку файлів, ви можете знайти getPath()корисніший шлях .
Тім Паренті

4
Чи можу я використовувати цей метод для пошуку всіх файлів певного типу, скажімо, у форматі pdf чи html у всій системі? Моє занепокоєння полягає в ефективності, чи достатньо швидко його використовувати для систем з тисячами файлів чи є краща альтернатива?
Нітін Лабхішетті

@codeln Що стосується Java 8, продуктивність дуже прийнятна, ви нічого не помічаєте з цього приводу. Це досить швидко, ефективно та читано, щоб виконати свою роботу.
tom_mai78101

17
У Java 8 ви також можете скористатися filterметодом. Тоді для кожного не потрібен. Дивіться тут -> stackoverflow.com/a/26215931/1029251
Julian Pieles

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 (path -> System.out.println (path.toString ()); повинен бути .forEach (path -> 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/…
Julian Pieles

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

З явадока Files.walkметоду:

Повернений потік інкапсулює один або кілька DirectoryStreams. Якщо потрібне своєчасне розпорядження ресурсами файлової системи, слід використовувати конструкцію спробу-ресурсів, щоб переконатися, що метод закриття потоку викликається після завершення операцій потоку.


Ніколи не слід повторювати програму 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
Ласкаво просимо до ! Замість того, щоб опублікувати лише блок коду, поясніть, чому цей код вирішує поставлену проблему. Без пояснення це не відповідь.
Martijn Pieters

Погоджено, щойно розміщення коду не вийде, будь-ласка, додайте коментарі до коду ...
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 або внутрішньої пам’яті.
Sanket Thakkar

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 )


Мене бентежить приклад створення фільтра. Що новогоDirectoryStream.Filter <Шлях>. Чи можете ви показати, як це оголошено?
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 році :)
Харамоз

Оновіть 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 () Повертає масив абстрактних імен шляхів, що позначають файли в каталозі, позначені цим абстрактним іменем шляху.
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]);
            }
        }
    }

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 (поточний каталог / папка) - папка1, і ви хочете проаналізувати папку1 / підпапку, просто напишіть (у наведеному вище коді замість):

    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(..)хороший, коли ви так сильно бавитесь, що він не кине уникати причини припинення 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 Heap. Таким чином, кожен виклик рекурсії додає імена файлів до того ж ArrayList (ми НЕ створюємо новий ArrayList для кожного рекурсивного виклику).


1

Ви можете поставити шлях до аргументу та створити список із усіма шляхами файлів, а не вносити його до списку вручну. Потім використовуйте цикл і зчитувач. Приклад файлів 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
                 }}}

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 / класів. Щоб побачити, що доступно під час виконання

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

Вибачте, якщо це питання noob, але що я повинен пройти 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.