ошибка при перечислении файлов в каталоге - PullRequest
2 голосов
/ 13 сентября 2011

У меня есть класс Java для вывода списка файлов данного каталога.Он отлично работает с каталогами только с файлами и без подкаталогов.Но если внутри находится дочерний каталог, он дает исключение java.lang.StackOverflowError.Вот класс вместе с методом main ():

package test;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class DisplayFilesAndFolders {

    public static void main(String[] args) {
        try {
            List<File> files = getFileList();
            for(File file : files ){
              System.out.println(file);
            }
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static List<File> getFileList() throws FileNotFoundException{
        String sPath = "C:\\Users\\owner\\Desktop\\Screen Shot\\";
        File filePath = new File(sPath);
        List<File> fileList = new ArrayList<File>();
        File[] files = filePath.listFiles();
        List<File> fileandFolderList = Arrays.asList(files);
        for (File file : fileandFolderList) {
            fileList.add(file);
            if (file.isDirectory()) {
                List<File> innerFileList = getFileList();
                fileList.addAll(innerFileList);
            }
        }

        return fileList;

    }

}

Спасибо за ваше время.

Ответы [ 2 ]

4 голосов
/ 13 сентября 2011

Вам нужно взять корень поиска getFileList в качестве параметра и передавать подкаталог в качестве аргумента при каждом повторном выполнении.(В настоящее время вы начинаете с C:\Users\owner\Desktop\Screen Shot\ в каждом рекурсивном вызове.)

Попробуйте выполнить следующее (в моей системе это работает так, как задумано):

public class Test {

    public static void main(String[] args) {
        try {
            String root = "C:\\Users\\owner\\Desktop\\Screen Shot\\";
            List<File> files = getFileList(new File(root));
            for(File file : files ){
                System.out.println(file);
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static List<File> getFileList(File filePath)
            throws FileNotFoundException{

        List<File> fileList = new ArrayList<File>();
        File[] files = filePath.listFiles();
        List<File> fileandFolderList = Arrays.asList(files);
        for (File file : fileandFolderList) {
            fileList.add(file);
            if (file.isDirectory()) {
                List<File> innerFileList = getFileList(file);
                fileList.addAll(innerFileList);
            }
        }

        return fileList;
    }
}
1 голос
/ 13 сентября 2011

Ранее я реализовал нечто подобное вашему методу, а также получил исключение StackOverflowException, поскольку не проверял, является ли файл символической ссылкой. Если вы позвоните isDirectory по символической ссылке, которая указывает на каталог, он вернет true. Таким образом, вы будете переходить по символической ссылке, которая может указывать куда угодно, что может привести к бесконечному обходу дерева и возникновению исключения StackOverflowException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...