Проход по дереву файлов

  • 28
  • Недоступна
1. На вход метода main подаются два параметра. Первый - path - путь к директории, второй - resultFileAbsolutePath - имя (полный путь) существующего файла, который будет содержать результат. 2. Переименовать resultFileAbsolutePath в 'allFilesContent.txt' (используй метод FileUtils.renameFile, и, если понадобится, FileUtils.isExist).
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (452)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Edil Kalmamatov
Уровень 35
11 сентября, 21:53
В копилку косяков валидатора - хочет непременно конструкцию try-with-resources такое его не устраивает:
FileOutputStream outputStream = new FileOutputStream(dest);
...
outputStream.close();
выдает ошибку "Поток для записи в файл нужно закрыть." хотя он явно закрывается
MaxGideon
Уровень 22, Москва
2 сентября, 08:02
Хорошая задачка, Может кому поможет... Использовал Files.walkFileTree для обхода файлов и каталогов в заданном каталоге, и выборке нужных файлов......Использовал ArrayList<File> для хранения всех файлов удовлетворяющих условию, затем в нем делал сортировку по имени и выдавал данные в цикле for написанному методу для чтения и записи данных из файла источника в файл назначения...
Белич Максим Работает в BelEnergo ❤
22 августа, 08:40
Хорошая задача, но теперь я понимаю, что значит борьба с валидатором. Не поленюсь и напишу пост, советую к прочтению! Если вы решили задачу и проверили ее на своем компьютере и все работает, но валидатор не принимает смело жмите правильное решение или бейтесь с валиком. ОБЪЯСНЯЮ)) 1) Не больше (<) для валидатора это значит (<=) Далее, была проблема, что поток для записи в файл должен быть открыт и закрыт! Но как! Я же все сделал!
public static void readingFromFilesAndWrite(File file, SortedSet<File> files) throws IOException {
        BufferedWriter writer = new BufferedWriter(new FileWriter(file.getAbsolutePath()));
        for(File fileFromSet : files){
            List<String> contentFromFile = Files.readAllLines(Paths.get(fileFromSet.getAbsolutePath()));
            for(String stringFromFile : contentFromFile){
                writer.write(stringFromFile);
                writer.flush();
            }
            writer.write("\n");
            writer.flush();
        }
        writer.close();
    }
Сделал специально отдельный для этого метод! Но Валику все равно. Думаю ладно, идем дальше, может ему в мейне нужно создать поток для записи и закрыть его там? Делаем:
Белич Максим Работает в BelEnergo ❤
22 августа, 08:43
Сделаем фейковый поток для записи в файл
BufferedWriter fakeWriter= new BufferedWriter(new FileWriter(destination));
fakeWriter.close();
Валик перестал ругаться на то, что нужно открыть и закрыть поток для записи в файл. Но теперь стал ругаться на то, что я не записываю в файл! НО КАК ЭТО ТАК? ВСЕ ЖЕ ЗАПИСЫВАЕТСЯ! И ЗНАЕТЕ ЧТО МНЕ ПОМОГЛО?)) ЗАКРЫТЬ ФЕЙКОВЫЙ ПОТОК ЗАПИСИ ПОСЛЕ ВЫЗОВА МЕТОДА, В КОТОРОМ Я РЕАЛЬНО ЗАПИСЫВАЮ СТРОКИ В ФАЙЛ!!! Так не работает:
BufferedWriter fakeWriter= new BufferedWriter(new FileWriter(destination));
fakeWriter.close();
readingFromFilesAndWrite(destination, set);
Так работает:
BufferedWriter fakeWriter = new BufferedWriter(new FileWriter(destination));
readingFromFilesAndWrite(destination, set);
fakeWriter.close();
Белич Максим Работает в BelEnergo ❤
22 августа, 08:54
+ К тому же. Пришлось писать собственный компаратор (хотя в комментариях прочитал, что можно сразу в параметры TreeSet передать такую строку:
SortedSet<File> set = new TreeSet<>(Comparator.comparing(File::getName));
У меня же было
SortedSet<File> set = new TreeSet<>(new MyComp());
Что один вариант, что другой НЕ ВЕРНЫЙ, но валидатор с радостью принимает! Я пробовал на своем компьютере создать папки a, b, c. В этих папках создать в разнобой папки b,a,c. И конечной папке создать одноименный файл .txt. Если файлов несколько с одним именем (например а.txt), то для TreeSet это будет один файл и он просто перезапишет его другим, с таким же именем! Это же не правильно! Весь контент из стертого файла утерян! Додуматься как сортировать путь до файла именем файла (сорри за тавтологию) я пока не смог (чтобы сделать задачу правильно, а не как нужно валидатору). Хотя если посидеть часик - другой, то можно написать метод аля пузырька, который сравнивает имена файлов и меняет их расположение в аррэй листе в зависимости от того, что вернул метод compareTo. Задача интересная, пришлось покопаться в доках во всех этих классах Files, path, file. Складывается какое-то представление что это. Просто нужно знать, что если в задаче разобрался и понимаешь как что работает, а валик ее не принимает, ну нужно отчаиваться, мы не тупые.
Hanyuu
Уровень 37, Москва
21 августа, 22:49
NEW GEN
Уровень 35, Лениногорск (Мухосранск) (Татарстан), Россия
19 августа, 09:37
Can not rename file with name 9999.txt но файл перименовывается)
Татьяна Мацеонжек
Уровень 35, Москва, Россия
5 августа, 11:49
Похоже автор этой задачи и задачи про ресторан один и тот же
Leo
Уровень 26, Москва
31 июля, 12:40
Из моего опыта удовлетворения госпожи Валидатор: - allFilesContent.txt должен быть в том же каталоге, что и resultFileAbsolutePath (из условия это неочевидно, хотя из указания "переименовать" можно как то додуматься до этого); - обратите внимание "... в ее всех вложенных поддиректориях...". Я прозевал почему то, хотя это понятно и логично; - если для записи каждого файла создавать новый поток вывода - валя отказывается принимать решение. Должен быть один поток для записи и много потоков для чтения. Надеюсь это кому то поможет сделать меньше, чем 8 (!) попыток((
Kes Чайник в Банк
27 июля, 04:50
Опять они забыли дописать требование: Код должен в точности соответствовать решению от JavaRush
Алексей Халимов
Уровень 35, Харьков, Украина
5 июля, 11:44
Зачем то делал через интерфейсы Path и Files, узнал новое, обрадовался простате работы с ним, получил оргазм, отправился в нирвану, запустил и увидел: пошёл переписывать через "актуальный" класс File
Ilya Lykov
Уровень 22
21 июля, 11:34
+ писал в файл, через Filechannel, ByteBuffer и RandomAccessFile. Валя не видит поток на запись.
Игорь
Уровень 39, Братск, Россия
3 июля, 18:17
Да ладно, эта задача прошла тестирование. Была только одна ошибка, что я старый файл вместо переименованного использовал, но могу сказать, я сначало не знал что FileUtils, это оказывается собственная реализация и не посмотрел в его реализацию.