powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Рекурсивный вывод директорий
25 сообщений из 35, страница 1 из 2
Рекурсивный вывод директорий
    #38454418
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, почему я получаю NullPointerException? Пытаюсь рекурсивно вывести пути всех директорий.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    private static void listDirs(String paths) {
        for (File dirs : (new File(paths)).listFiles()) {
            if (dirs.isDirectory())
                try {
                    System.out.println(dirs.getCanonicalPath());
                    listDirs(dirs.getCanonicalPath());

                } catch (IOException e) {
                    e.printStackTrace(); 
                }

        }
    }
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454430
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В какой строке?
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454435
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczВ какой строке?
на форе вываливается
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454444
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listFiles() вернул null?
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454447
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А отладчика у вас нет под рукой? В блокноте пишете?
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454452
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczlistFiles() вернул null?
Насколько я понимаю, да. Вот вывод компилятора

Exception in thread "main" java.lang.NullPointerException
at Main.listDirs(Main.java:48)
at Main.listDirs(Main.java:51)
at Main.main(Main.java:36)
48 строка это цикл, 51 - listDirs(dirs.getCanonicalPath()); 36 - вызов метода listDirs.

Ошибка не сразу выскакивает, а спустя какое-то время отработки, если это важно. С чем связано - не пойму.
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454456
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczА отладчика у вас нет под рукой? В блокноте пишете?
Есть, но это ничего не дало. Падает на разных директориях.
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454475
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmankaЕсть, но это ничего не дало.
А что вы сделали чтобы оно не дало? Я бы сделал, для начала, локальные переменные, чтобы было проще отлаживать. Посмотрел что именно вываливается в null.

sharmankaПадает на разных директориях.
Например? Кстати, а зачем в каждой итерации гонять File в String и обратно? Ведь можно всё сделать исключительно на File, без использования String.
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454476
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sharmanka,

может дириктория не содержит ничего?
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454482
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmanka48 строка это цикл, 51 - listDirs(dirs.getCanonicalPath()); 36 - вызов метода listDirs.

Что-то не очень совпадает с приведенным кодом.

sharmankaОшибка не сразу выскакивает, а спустя какое-то время отработки, если это важно. С чем связано - не пойму.
А ещё в продакшн системах обычно отказываются от использования рекурсии. Потому файловая система позволяет создать дерево достаточно глубокое, чтобы выхватить StackOverflowError.
А ещё файловые системы позволяют создавать рекурсивные каталоги. :)
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454527
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczНапример?
Грубо говоря, при одном запуске может упасть в папке D:\one\two, а при другом в D:\three\four\five
BlazkowiczКстати, а зачем в каждой итерации гонять File в String и обратно? Ведь можно всё сделать исключительно на File, без использования String.
Ваша правда, переделал.
am_sasaможет дириктория не содержит ничего?
тогда бы падало на первой пустой директории
BlazkowiczЧто-то не очень совпадает с приведенным кодом.

каким образом не совпадает?

BlazkowiczА ещё в продакшн системах обычно отказываются от использования рекурсии. Потому файловая система позволяет создать дерево достаточно глубокое, чтобы выхватить StackOverflowError.
А ещё файловые системы позволяют создавать рекурсивные каталоги. :)
тогда подскажите мне как лучше обойти все директории на диске? С джавой работаю недавно, тонкостей не знаю.
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454531
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmanka48 строка это цикл, 51 - listDirs(dirs.getCanonicalPath());

Код: java
1.
2.
3.
4.
5.
48       for (File dirs : (new File(paths)).listFiles()) {
49            if (dirs.isDirectory())
50                try {
51                    System.out.println(dirs.getCanonicalPath());
52                    listDirs(dirs.getCanonicalPath());
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454532
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кстати, да. Падает на paths.listFiles()
В доках фижу следующее
авторReturns
* {@code null} if this abstract pathname does not denote a
* directory, or if an I/O error occurs.
это меня ставит немного в тупик, с чего бы I/O эксепшен может возникнуть
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454535
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая версия Java?
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454550
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczsharmanka48 строка это цикл, 51 - listDirs(dirs.getCanonicalPath());

Код: java
1.
2.
3.
4.
5.
48       for (File dirs : (new File(paths)).listFiles()) {
49            if (dirs.isDirectory())
50                try {
51                    System.out.println(dirs.getCanonicalPath());
52                    listDirs(dirs.getCanonicalPath());


Забыл что удалил строку :( На listDirs(dirs.getCanonicalPath()); указывало. А вообще, я сейчас вот так переписал:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    private static void listDirs(File paths) {
        File[] plf = paths.listFiles();
        if (plf != null)
            for (File dirs : plf) {
                if (dirs.isDirectory()) try {
                    System.out.println(dirs.getCanonicalPath());
                    listDirs(dirs);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    }


Работает, но проверка на нулл меня не радует. Хотелось бы разобраться в причинах

BlazkowiczКакая версия Java?
1.7.0_21
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454560
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmankaРаботает, но проверка на нулл меня не радует. Хотелось бы разобраться в причинах

Странно в Java 7 обещали что будет исключени выкидывать вместо null.

sharmanka1.7.0_21
Может на NIO переписать?
http://stackoverflow.com/questions/10523585/how-to-read-files-recursively-in-java-7
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454571
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно пример директорий для которых null выводиться? Они сильно глубокие? Они точно не системные?
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454576
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Антивирусы установлены?
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454590
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    private static void printDirectoryList(File rootDir) throws IOException {
        if (rootDir.isDirectory()) {
            System.out.println(rootDir.getCanonicalPath());
            for (File file : rootDir.listFiles()) {
                printDirectoryList(file);
            }
        }
    }
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454591
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczМожет на NIO переписать?
Попробую.
BlazkowiczА можно пример директорий для которых null выводиться? Они сильно глубокие? Они точно не системные?
Есть и глубокие, есть и системные. Пару примеров
D:\android\sdk\tools\templates\projects\NewJavaLibrary\root\src\library_package
D:\Dropbox\.dropbox.cache
D:\Сейм_2013
D:\$RECYCLE.BIN\S-1-5-21-3348034925-730243719-2734347485-1000\$RGMLHBD.5\docs\apidocs\net\sourceforge\pmd\lang\java
D:\Games\Crysis2\gamecrysis2\Levels\Prism\Minimap
BlazkowiczАнтивирусы установлены?
др. Веб


Кстати, если рекурсивно обходить директории это плохо, то как надо в таком случае поступать?
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454623
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmankaдр. Веб

А если отключить?

sharmankaКстати, если рекурсивно обходить директории это плохо, то как надо в таком случае поступать?
Заменть хранение родительских File на Java стэке, на хранение его в коллекции.
https://www.google.com/search?q=разворачивание рекурсии в цикл
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454705
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczА если отключить?

Тогда эксепшен на одной и той же директории, на которую нет прав чтения. Вот уж не подумал бы, что это проделки антивиря
BlazkowiczЗаменть хранение родительских File на Java стэке, на хранение его в коллекции.
https://www.google.com/search?q=разворачивание рекурсии в цикл
А не будет проблем, если каталогов больше чем размер int? Ведь доступ идет по индексу, который имеет тип int.
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454714
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmankaТогда эксепшен на одной и той же директории, на которую нет прав чтения. Вот уж не подумал бы, что это проделки антивиря

Рандомные IO ошибки. Кого же ещё винить?

sharmankaА не будет проблем, если каталогов больше чем размер int? Ведь доступ идет по индексу, который имеет тип int.
Будет проблема если у вас вложеность каталогов превысит int.
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454729
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczБудет проблема если у вас вложеность каталогов превысит int.
Я сделал так:
1. Создал список с одним начальным элементом (корень диска) и с дженерик типом File
2. Аналогично коду выше получаю listFiles и проверяю по очереди, являются ли элементы директориями
3. Если да, добавляю в конец списка
4. Перехожу к следующему элементу списка
Имелась ввиду другая логика?
...
Рейтинг: 0 / 0
Рекурсивный вывод директорий
    #38454739
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczsharmankaдр. Веб

А если отключить?

sharmankaКстати, если рекурсивно обходить директории это плохо, то как надо в таком случае поступать?
Заменть хранение родительских File на Java стэке, на хранение его в коллекции.
https://www.google.com/search?q=разворачивание рекурсии в цикл
Собственно применение рекурсии вообще не является атипаттерном. Она (рекурсия)
де-факто присутствует во многих библиотеках XML-парсеров, regexps e.t.c. Просто в данном
конкретном случае можно в listDirs добавить счётчик уровня (level) и ограничить
рекурсию. Для listFiles конечно проверять на not-null.

По поводу сим-линков и хард-линков с "петлями". Я на такие злостные случаи не нарывался
но думаю что FileAPI позволит нам узнать что это за нода.

Счастливые обладатели Java7 радостно танцуют
http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#isSymbolicLink(java.nio.file.Path)

Несчастливые обладатели тухлых версий смотрят в stackoverflow. Там был workaround
для этого случая. И я-бы предложил некий буфер для (жуть медленного ) поиска
повторений в путях.
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Рекурсивный вывод директорий
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]