|
|
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
Подскажите, почему я получаю NullPointerException? Пытаюсь рекурсивно вывести пути всех директорий. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 13:42:15 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
В какой строке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 13:45:32 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВ какой строке? на форе вываливается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 13:46:33 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
listFiles() вернул null? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 13:51:53 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
А отладчика у вас нет под рукой? В блокноте пишете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 13:53:49 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
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. Ошибка не сразу выскакивает, а спустя какое-то время отработки, если это важно. С чем связано - не пойму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 13:56:34 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
BlazkowiczА отладчика у вас нет под рукой? В блокноте пишете? Есть, но это ничего не дало. Падает на разных директориях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 13:57:52 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
sharmankaЕсть, но это ничего не дало. А что вы сделали чтобы оно не дало? Я бы сделал, для начала, локальные переменные, чтобы было проще отлаживать. Посмотрел что именно вываливается в null. sharmankaПадает на разных директориях. Например? Кстати, а зачем в каждой итерации гонять File в String и обратно? Ведь можно всё сделать исключительно на File, без использования String. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:04:03 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
sharmanka, может дириктория не содержит ничего? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:04:32 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
sharmanka48 строка это цикл, 51 - listDirs(dirs.getCanonicalPath()); 36 - вызов метода listDirs. Что-то не очень совпадает с приведенным кодом. sharmankaОшибка не сразу выскакивает, а спустя какое-то время отработки, если это важно. С чем связано - не пойму. А ещё в продакшн системах обычно отказываются от использования рекурсии. Потому файловая система позволяет создать дерево достаточно глубокое, чтобы выхватить StackOverflowError. А ещё файловые системы позволяют создавать рекурсивные каталоги. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:07:17 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНапример? Грубо говоря, при одном запуске может упасть в папке D:\one\two, а при другом в D:\three\four\five BlazkowiczКстати, а зачем в каждой итерации гонять File в String и обратно? Ведь можно всё сделать исключительно на File, без использования String. Ваша правда, переделал. am_sasaможет дириктория не содержит ничего? тогда бы падало на первой пустой директории BlazkowiczЧто-то не очень совпадает с приведенным кодом. каким образом не совпадает? BlazkowiczА ещё в продакшн системах обычно отказываются от использования рекурсии. Потому файловая система позволяет создать дерево достаточно глубокое, чтобы выхватить StackOverflowError. А ещё файловые системы позволяют создавать рекурсивные каталоги. :) тогда подскажите мне как лучше обойти все директории на диске? С джавой работаю недавно, тонкостей не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:26:52 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
sharmanka48 строка это цикл, 51 - listDirs(dirs.getCanonicalPath()); Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:29:55 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
кстати, да. Падает на paths.listFiles() В доках фижу следующее авторReturns * {@code null} if this abstract pathname does not denote a * directory, or if an I/O error occurs. это меня ставит немного в тупик, с чего бы I/O эксепшен может возникнуть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:30:17 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
Какая версия Java? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:31:15 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
Blazkowiczsharmanka48 строка это цикл, 51 - listDirs(dirs.getCanonicalPath()); Код: java 1. 2. 3. 4. 5. Забыл что удалил строку :( На listDirs(dirs.getCanonicalPath()); указывало. А вообще, я сейчас вот так переписал: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Работает, но проверка на нулл меня не радует. Хотелось бы разобраться в причинах BlazkowiczКакая версия Java? 1.7.0_21 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:36:53 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
sharmankaРаботает, но проверка на нулл меня не радует. Хотелось бы разобраться в причинах Странно в Java 7 обещали что будет исключени выкидывать вместо null. sharmanka1.7.0_21 Может на NIO переписать? http://stackoverflow.com/questions/10523585/how-to-read-files-recursively-in-java-7 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:41:54 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
А можно пример директорий для которых null выводиться? Они сильно глубокие? Они точно не системные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:45:07 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
Антивирусы установлены? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:45:30 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:51:47 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
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Антивирусы установлены? др. Веб Кстати, если рекурсивно обходить директории это плохо, то как надо в таком случае поступать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:51:49 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
sharmankaдр. Веб А если отключить? sharmankaКстати, если рекурсивно обходить директории это плохо, то как надо в таком случае поступать? Заменть хранение родительских File на Java стэке, на хранение его в коллекции. https://www.google.com/search?q=разворачивание рекурсии в цикл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 15:04:58 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
BlazkowiczА если отключить? Тогда эксепшен на одной и той же директории, на которую нет прав чтения. Вот уж не подумал бы, что это проделки антивиря BlazkowiczЗаменть хранение родительских File на Java стэке, на хранение его в коллекции. https://www.google.com/search?q=разворачивание рекурсии в цикл А не будет проблем, если каталогов больше чем размер int? Ведь доступ идет по индексу, который имеет тип int. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 15:46:11 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
sharmankaТогда эксепшен на одной и той же директории, на которую нет прав чтения. Вот уж не подумал бы, что это проделки антивиря Рандомные IO ошибки. Кого же ещё винить? sharmankaА не будет проблем, если каталогов больше чем размер int? Ведь доступ идет по индексу, который имеет тип int. Будет проблема если у вас вложеность каталогов превысит int. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 15:51:02 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
BlazkowiczБудет проблема если у вас вложеность каталогов превысит int. Я сделал так: 1. Создал список с одним начальным элементом (корень диска) и с дженерик типом File 2. Аналогично коду выше получаю listFiles и проверяю по очереди, являются ли элементы директориями 3. Если да, добавляю в конец списка 4. Перехожу к следующему элементу списка Имелась ввиду другая логика? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 15:58:24 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
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 для этого случая. И я-бы предложил некий буфер для (жуть медленного ) поиска повторений в путях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 16:05:26 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
maytonСобственно применение рекурсии вообще не является атипаттерном. Когда как. Если у нас возможны глубокие рекурсии, то нужно разворачивать. Если у нас многопоточный сервер, то можно сэкономить памяти уменьшив размер стека. Но алгоритмы реализованые на рекурсии нам могут испортить всё удовольствие от оптимизации. maytonОна (рекурсия) де-факто присутствует во многих библиотеках XML-парсеров, regexps e.t.c. Это не делает рекурсию автоматически хорошим решеним. http://search.oracle.com/search/search?search_p_main_operator=all&start=1&group=bugs.sun.com&q=StackOverflowError maytonСчастливые обладатели Java7 радостно танцуют http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#isSymbolicLink(java.nio.file.Path) Да там вообще сплошные танцы http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#walkFileTree(java.nio.file.Path, java.util.Set, int, java.nio.file.FileVisitor) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 16:11:51 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
BlazkowiczmaytonОна (рекурсия) де-факто присутствует во многих библиотеках XML-парсеров, regexps e.t.c. Это не делает рекурсию автоматически хорошим решеним. http://search.oracle.com/search/search?search_p_main_operator=all&start=1&group=bugs.sun.com&q=StackOverflowError Я думаю "дорога ложка к обеду". Сама по себе задача разворачивания рекурсии в Stack<> сложна и нетрививиальна. Ее невозможно зеэстимэйтить по срокам. Поэтому лучше пока кодить как есть. А при возникновении Stack Overflow думать над оптимизациями. Возможно они лежат в плоскости шардинга или уменьшения объёма задачь путём деления на части (порции) обработки. Но саму постановку типа разворачивание рекурсии я никому не пожелаю в качестве дефекта или ТЗ на доработку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 17:07:29 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
maytonСама по себе задача разворачивания рекурсии в Stack<> сложна и нетрививиальна. Почему? Тут у автора на стеке одна переменная - File - решение банальное на цикле выходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 17:11:03 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
BlazkowiczmaytonСама по себе задача разворачивания рекурсии в Stack<> сложна и нетрививиальна. Почему? Тут у автора на стеке одна переменная - File - решение банальное на цикле выходит. Вот пускай он щас в топике без подсказок это воплотит. А еще я-бы голосование поднял. Какой процент разработчиков (неглупых в своём классе из знающих прекрасно предметную область) вообще захотят браться за разворот рекурсий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 17:15:52 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
maytonВот пускай он щас в топике без подсказок это воплотит. Не аргумент. maytonА еще я-бы голосование поднял. Какой процент разработчиков (неглупых в своём классе из знающих прекрасно предметную область) вообще захотят браться за разворот рекурсий. Тоже. В чем именно сложности? Мне правда интересно. Объединяем все переменные хранимые на стэке в одну структуру. Заводим коллекцию под стэк, пока стэк не пуст, заполняем\удаляем из него элементы в зависимости от логики рекурсии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 17:22:45 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
Блажкович. Я думаю что для тебя действительно это не проблема. Но я вел немного практику у студентов и я знаю над чем они парятся и что у них вызывает реальный затык. Это просто результат моих наблюдений. Не бизнес-код а именно алгоритмизация вызывает у них зависание головного мозга. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 18:05:53 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Зачем развертывать в рекурсию, которая нуждается в стеке состояний? Чтобы она вместо своего стека в случае чего могла заполнить всю память JVM? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 18:26:45 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
ЛагманЗачем развертывать в рекурсию, которая нуждается в стеке состояний? А зачем вообще нужна рекурсия если она не нуждается в этом стеке? :) ЛагманЧтобы она вместо своего стека в случае чего могла заполнить всю память JVM? Именно. По-идее цикл должен быть быстрее. Цикл не приведет к StackOverflowError в случае глубокой рекурсии. Хотя это можно решить, запуская задачу через новый поток с заданным размером стека. Ну, и как я уже написал выше, если у нас многопоточный сервер, мы сможем сэкономить на памяти. Ведь стэк под поток выделяется целиком и сразу фиксированого размера. А с коллекцией в куче, память выделяется только там где этого действительно нужно для обсчета рекурсии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 18:32:47 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Ок, убедили :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 18:36:34 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2128261]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
174ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 192ms |
| total: | 475ms |

| 0 / 0 |
