Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Рекурсивный вывод директорий / 25 сообщений из 35, страница 1 из 2
06.11.2013, 13:42:15
    #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
06.11.2013, 13:45:32
    #38454430
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный вывод директорий
В какой строке?
...
Рейтинг: 0 / 0
06.11.2013, 13:46:33
    #38454435
sharmanka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный вывод директорий
BlazkowiczВ какой строке?
на форе вываливается
...
Рейтинг: 0 / 0
06.11.2013, 13:51:53
    #38454444
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный вывод директорий
listFiles() вернул null?
...
Рейтинг: 0 / 0
06.11.2013, 13:53:49
    #38454447
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный вывод директорий
А отладчика у вас нет под рукой? В блокноте пишете?
...
Рейтинг: 0 / 0
06.11.2013, 13:56:34
    #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
06.11.2013, 13:57:52
    #38454456
sharmanka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный вывод директорий
BlazkowiczА отладчика у вас нет под рукой? В блокноте пишете?
Есть, но это ничего не дало. Падает на разных директориях.
...
Рейтинг: 0 / 0
06.11.2013, 14:04:03
    #38454475
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный вывод директорий
sharmankaЕсть, но это ничего не дало.
А что вы сделали чтобы оно не дало? Я бы сделал, для начала, локальные переменные, чтобы было проще отлаживать. Посмотрел что именно вываливается в null.

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

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

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

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

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

BlazkowiczА ещё в продакшн системах обычно отказываются от использования рекурсии. Потому файловая система позволяет создать дерево достаточно глубокое, чтобы выхватить StackOverflowError.
А ещё файловые системы позволяют создавать рекурсивные каталоги. :)
тогда подскажите мне как лучше обойти все директории на диске? С джавой работаю недавно, тонкостей не знаю.
...
Рейтинг: 0 / 0
06.11.2013, 14:29:55
    #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
06.11.2013, 14:30:17
    #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
06.11.2013, 14:31:15
    #38454535
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный вывод директорий
Какая версия Java?
...
Рейтинг: 0 / 0
06.11.2013, 14:36:53
    #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
06.11.2013, 14:41:54
    #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
06.11.2013, 14:45:07
    #38454571
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный вывод директорий
А можно пример директорий для которых null выводиться? Они сильно глубокие? Они точно не системные?
...
Рейтинг: 0 / 0
06.11.2013, 14:45:30
    #38454576
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный вывод директорий
Антивирусы установлены?
...
Рейтинг: 0 / 0
06.11.2013, 14:51:47
    #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
06.11.2013, 14:51:49
    #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
06.11.2013, 15:04:58
    #38454623
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный вывод директорий
sharmankaдр. Веб

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

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

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

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

sharmankaА не будет проблем, если каталогов больше чем размер int? Ведь доступ идет по индексу, который имеет тип int.
Будет проблема если у вас вложеность каталогов превысит int.
...
Рейтинг: 0 / 0
06.11.2013, 15:58:24
    #38454729
sharmanka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный вывод директорий
BlazkowiczБудет проблема если у вас вложеность каталогов превысит int.
Я сделал так:
1. Создал список с одним начальным элементом (корень диска) и с дженерик типом File
2. Аналогично коду выше получаю listFiles и проверяю по очереди, являются ли элементы директориями
3. Если да, добавляю в конец списка
4. Перехожу к следующему элементу списка
Имелась ввиду другая логика?
...
Рейтинг: 0 / 0
06.11.2013, 16:05:26
    #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
Форумы / Java [игнор отключен] [закрыт для гостей] / Рекурсивный вывод директорий / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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