Я не понимаю кто те люди, которые знают как решать такие задачи, по-ходу программирование не моя тема, если уже на этом уровне, я больше половины кода не то что не написал, а даже не понял его в правильном ответе О_о
Ну да, про это насколько помню не рассказывали. Пришлось загуглить, прилепить найденное и отправить. Ну там если совсем в хордкор охота нужно смотреть про рекурсивный обход дерева файлов (и писать обход самому), ну чего-то лениво
Готовые решения попроще типа
try (Stream<Path> walk = Files.walk(path)) {
result = walk.filter(Files::isRegularFile)
.map(x -> x.toString())
.collect(Collectors.toList());
}
return result;
И в авторских решениях идет решение через Files.walkFileTree()..FileVisitor и всякое.
Оно описано здесь Java Files, Path
..задачка явно должна быть в другом месте
решил 1-ю сложную только после подсказки ,что в переданной директории могут быть не только файлы.
решение прошло через рекурсивный метод,который в List<byte[]> собирает все прочитанные файлы, и потом все это записывает с проверкой на длину массива не больше 50. А так да, без подглядывания не решил бы, просто впадлу было использовать именно готовое решение. Так же не погнял зачем между записями новых файло добавлять символ новой строки. короче тяжело ппц.
Перед тем как решать 3-ю задачу рекомендую прочитать статью - Разбор утилиты Files.walkFileTree()
Мне показалось, что автор задачи и статьи - один человек 😁
По факту весь написанный код реально повторяет пройденную лекцию. В третьей задаче чуть нужно разобраться в коде внутри которого находишься, но сам код строго по лекции.
А разбираться в чужом коде на работе придется постоянно. Так что привыкаем на обучении) Успехов!
Метод Files.walkFileTree() - это статический метод у класса Files, который
предназначен для того, чтобы пройти по какой-то папке, заглянуть внутрь
вложенных папок на несколько уровней, найти в них файлы с нужным нам
содержимым, и совершить с этими файлами какие-то действия.
Синтаксис у метода довольно громоздкий и требует использования нескольких
дополнительных классов. То есть перед тем, как запускать метод, требуется
создать еще парочку дополнительных объектов, которые будем передавать
методу в качестве аргументов. Всего у этого метода четыре аргумента.
Первый аргумент задает ту папку, которую будем исследовать. Это обычный
объект Path.
Второй аргумент определяет, будет ли метод проходить по ссылкам и
просматривать то, что там содержится. Данный аргумент как
раз является объектом дополнительного класса, этот класс
нужно импортировать, а объект нужно предварительно создать
перед запуском метода.
Третий аргумент задает, на сколько уровней вглубь метод будет проходить
вложенные подпапки. Тут никаких сложностей, это обычное
число int.
Четвертый аргумент задает те самые действия, которые будут применяться ко
всем файлам в дереве. Вот тут все через жо... в смысле
сложновато. Эти действия прописываются в отдельном
методе visitFile(), который находится в еще одном
дополнительном классе - SimpleFileVisitor, а объект этого
класса и будет четвертым аргументом.
Упомянутый SimpleFileVisitor - это класс-потомок интерфейса FileVisitor, в
котором описаны все методы для обхода дерева файлов.
Помимо метода visitFile(), в котором прописываются все нужные действия,
применяемые к каждому файлу в дереве, там есть еще парочка методов.
В них можно вписать, что делать при входе в каждую подпапку, что делать,
если папка не найдена, и еще всякие мелочи.
Работает это так.
Метод Files.walkFileTree() проходит вдоль изучаемой папки и для каждого
файла в ней и в ее вложенных папках вызывает метод visitFile(). Этот метод
делает то, что мы в нем напишем, а потом возвращает объект еще одного
класса - FileVisitResult.
В зависимости от этого возвращенного значения метод Files.walkFileTree()
либо вызывает метод visitFile() для следующего файла, либо завершает работу.
Ну а теперь давайте уже сделаем все так, как у нас тут любят - подробно
по пунктам опишем весь порядок действий.
Подробный порядок действий
----------------------------------------------------------
1. Создаем объект Path с путем к той папке, которую будем исследовать.
2. Создаем объект класса EnumSet<FileVisitOption>.
Этот объект может принимать одно из фиксированных значений, заданных
enum-перечнем. Выбранное значение определяет поведение в отношении
ссылок. Например, если мы хотим при обходе дерева следовать по
символьным ссылкам, то данному объекту придаем вот такое значение:
EnumSet<FileVisitOption> options =
EnumSet.of(FileVisitOption.FOLLOW_LINKS);
3. Создаем отдельный класс, унаследованный от класса SimpleFileVisitor.
4. В этом классе переопределяем метод visitFile()
Более точно он выглядит вот так:
public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException
Тут мы прописываем все, что нужно делать с каждым файлом или подпапкой,
которые содержатся в исследуемой папке.
5. После того, как прописали все необходимые действия, пишем следующее:
- либо return FileVisitResult.CONTINUE
это если после нахождения нужного файла нужно продолжать обход
директории и искать другие файлы, соответствующие поставленному условию
- либо return FileVisitResult.TERMINATE
это если мы хотим завершить обход после того, как найден хотя бы один файл,
соответствующий условию.
- либо return FileVisitResult.SKIP_SUBTREE
это чтобы продолжать обход без захода в данную папку.
6. Наконец запускаем метод Files.walkFileTree() и передаем ему четыре аргумента:
- объект Path с путем к исследуемой папке,
- созданный объект EnumSet<FileVisitOption>,
- число int, задающее глубину прохода подпапок,
- и объект созданного класса-потомка от класса SimpleFileVisitor, в котором лежит
метод visitFile()
Найс, в первой задачке засчитало пункт "Содержимое всех файлов, размер которых не превышает 50 байт, должно быть записано в файл allFilesContent.txt.", но не засчитало пункт "Файл, который приходит вторым параметром в main, должен быть переименован в allFilesContent.txt."
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ