Ну вроде все оттестировал, и файлы больше 50 байт отсеиваются, и по имени файла без пути сортируется, и записывается как положено, и на любую глубину вложения папок вылавливает. Что не так?
package com.javarush.task.task31.task3101;
import java.io.*;
import java.util.*;
/*
1. На вход метода main() подаются два параметра.
Первый - path - путь к директории, второй - resultFileAbsolutePath - имя (полный путь) существующего файла, который будет содержать результат.
2. Переименовать resultFileAbsolutePath в allFilesContent.txt (используй метод FileUtils.renameFile(), и, если понадобится, FileUtils.isExist()).
3. Для каждого файла в директории path и в ее всех вложенных поддиректориях выполнить следующее:
Если у файла длина в байтах НЕ больше 50, то для всех таких файлов:
3.1. Отсортировать их по имени файла в возрастающем порядке, путь не учитывать при сортировке.
3.2. В allFilesContent.txt последовательно записать содержимое всех файлов из п. 3.1. После каждого тела файла записать "\n".
Все файлы имеют расширение txt.
В качестве разделителя пути используй "/".
Для создания файлов используй конструктор File(String pathname).
Требования:
1. Файл, который приходит вторым параметром в main, должен быть переименован в allFilesContent.txt.
2. Нужно создать поток для записи в переименованный файл.
3. Содержимое всех файлов, размер которых не превышает 50 байт, должно быть записано в файл allFilesContent.txt в отсортированном по имени файла порядке.
4. Поток для записи в файл нужно закрыть.
5. Не используй статические переменные.
*/
public class Solution {
public static void main(String[] args) throws IOException {
//Разбираем агрументы на путь директории и файл для переименования
File directory = new File(args[0]);
File resultFileAbsolutePath = new File(args[1]);
//Определяем папку, в которой лежит файл для переименования, создаем новый файл
String parentDirectory=resultFileAbsolutePath.getParent();
File allFilesContent = new File(parentDirectory+"/allFilesContent.txt");
//Провряем, есть ли исходный файл или создаем новый
if(!FileUtils.isExist(resultFileAbsolutePath)){
resultFileAbsolutePath.createNewFile();
}
//Удаляем итоговый файл, переименовываем в него исходный
allFilesContent.delete();
FileUtils.renameFile(resultFileAbsolutePath,allFilesContent);
//создаем поток записи
BufferedWriter writer = new BufferedWriter(new FileWriter(allFilesContent));
//определяем все файлы в поддиректориях
Map<File,String> result=allFilesAndDirectories(directory);
//Определяем файлы, которые весят менее 50 байт, складываем их в лист
List<File> littleFiles = new ArrayList<>();
for(Map.Entry<File,String> pair:result.entrySet()){
if(pair.getValue().equals("file")&&pair.getKey().length()<=50){
littleFiles.add(pair.getKey());
}
}
//Сортируем отобранные файлы по названию, без учета пути
Collections.sort(littleFiles, new Comparator<File>() {
@Override
public int compare(File file, File t1) {
return file.getName().compareTo(t1.getName());
}
});
//Записываем содержимое файлов и закрываем потоки
for (File file:littleFiles){
BufferedReader reader=new BufferedReader( new FileReader(file));
while (reader.ready()){
String s=reader.readLine();
System.out.println(s);
writer.write(s);
}
writer.write("\n");
reader.close();
}
writer.flush();
writer.close();
}
//Определяет все подпапки и файлы (включая переданную) и кладет в мапу <File, dir или file>
public static Map<File,String> allFilesAndDirectories(File directory){
Map<File,String> result=new HashMap<>();
result.put(directory,"dir");
File[] files = directory.listFiles();
if(files.length>0){
for(File file:files){
if(file.isDirectory()){
result.put(file,"dir");
result.putAll(allFilesAndDirectories(file));
} else {
result.put(file,"file");
}
}
}
return result;
}
}