И второй вопрос: В список файлов из которых будет читаться содержимое попадает файл в который мы собираемся записывать результат, это нормальное поведение?
Спасибо!
package com.javarush.task.task31.task3101;
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
/*
Проход по дереву файлов
1. На вход метода main подаются два параметра.
Первый - path - путь к директории, второй - resultFileAbsolutePath - имя (полный путь) существующего файла, который будет содержать результат.
2. Для каждого файла в директории path и в ее всех вложенных поддиректориях выполнить следующее:
Если у файла длина в байтах НЕ больше 50, то для всех таких файлов:
2.1. Отсортировать их по имени файла в возрастающем порядке, путь не учитывать при сортировке.
2.2. Переименовать resultFileAbsolutePath в 'allFilesContent.txt' (используй метод FileUtils.renameFile, и, если понадобится, FileUtils.isExist).
2.3. В allFilesContent.txt последовательно записать содержимое всех файлов из п. 2.2.1. После каждого тела файла записать "\n".
Все файлы имеют расширение txt.
В качестве разделителя пути используй "/".
Требования:
1. Файл, который приходит вторым параметром в main, должен быть переименован в allFilesContent.txt.
2. Нужно создать поток для записи в переименованный файл.
3. Содержимое всех файлов, размер которых не превышает 50 байт, должно быть записано в файл allFilesContent.txt в отсортированном по имени файла порядке.
4. Поток для записи в файл нужно закрыть.
5. Не используй статические переменные.
*/
public class Solution {
public static void main(String[] args) throws Exception {
List<File> fileList = new ArrayList<>();
File path = new File(args[0]);
File resultFileAbsolutePath = new File(args[1]);
/* File path = new File("C:\\Users\\User\\Pictures\\test");
File resultFileAbsolutePath = new File("C:\\Users\\User\\Pictures\\test\\test.txt");*/
File allFilesContent = new File(resultFileAbsolutePath.getParent() + "/allFilesContent.txt");
renameFile(resultFileAbsolutePath, allFilesContent);
List<File> filledList = fillFileList(path);
Comparator<File> byFileName = Comparator.comparing(f -> f.getName());
Comparator<File> byFileName1 = Comparator.comparing(File::getName);
fileList = filledList.stream()
.sorted(byFileName1)
.filter(f -> f.length() <= 50)
.collect(Collectors.toList());
FileWriter bufferedWriter = new FileWriter(allFilesContent);
System.out.println(fileList);
for (File f : fileList) {
BufferedReader br = new BufferedReader(new FileReader(f));
String line = "";
while (br.ready()) {
bufferedWriter.write(br.readLine());
}
bufferedWriter.write("\n");
br.close();
}
bufferedWriter.close();
}
private static List<File> fillFileList(File rootDir) {
List<File> result = new ArrayList<>();
Queue<File> fileTree = new PriorityQueue<>();
Collections.addAll(fileTree, rootDir.listFiles());
while (!fileTree.isEmpty()) {
File currentFile = fileTree.remove();
if (currentFile.isDirectory()) {
Collections.addAll(fileTree, currentFile.listFiles());
} else {
result.add(currentFile);
}
}
return result;
}
public static void renameFile(File source, File destination) {
if (!source.renameTo(destination)) System.out.println("Can not rename file with name " + source.getName());
}
}