Не могу понять в чем ошибка, протестировал с разным количеством вложенных каталогов, с разным количеством файлов - все работает.
Почитал подсказки, советуют создавать и закрывать потоки вначале, тоже не помогает. Менял местами некоторые строчки, без изменения сути программы, тоже не помогает.
Подскажите, что можно еще сделать?
Прикрепляю последнюю версию класса Solution.
package com.javarush.task.task31.task3101;
import java.io.*;
import java.nio.file.Files;
import java.util.*;
/*
Проход по дереву файлов
*/
public class Solution {
public static void main(String[] args) throws IOException {
//создаем объекты File
File dir = new File(args[0]);//директория
File resultFileAbsolutePath = new File(args[0] + "/" + args[1]);
File allFilesContent = new File(resultFileAbsolutePath.getParent() + "/allFilesContent.txt");
FileUtils.renameFile(resultFileAbsolutePath, allFilesContent);
FileOutputStream out = new FileOutputStream(allFilesContent);
out.close();
List<File> fileList = new ArrayList<>();//список для хранения всех файлов
//проходим по каждому файлу/каталогу из исходной директории
for (File file : dir.listFiles()) {
walker(file, fileList);
}
//сортируем по имени файла
fileList.sort(Comparator.comparing(File::getName));
//открываем поток записи
try (OutputStream writer = Files.newOutputStream(allFilesContent.toPath())) {
//для каждого файла из списка
for (File file : fileList) {
//если файл существует
if (FileUtils.isExist(file)) {
//открываем поток чтения
try (InputStream reader = Files.newInputStream(file.toPath())) {
//пока есть непрочитанное
while (reader.available() > 0) {
//читаем и записываем строку
byte[] buff = new byte[reader.available()];
reader.read(buff);
writer.write(buff);
}
} catch (IOException e) {
e.printStackTrace();
}
}
//добавляем в конце символ \n как того требует валидатор
writer.write("\\n".getBytes());
}
} catch (IOException e) {
e.printStackTrace();
}
}
//метод для обхода всех файлов
private static void walker(File file, List<File> fileList) {
//если файл директория
if (FileUtils.isExist(file) && file.isDirectory()) {
//для каждого файла в директории рекурсивно вызываем этот метод
for (File f : file.listFiles()) {
walker(f, fileList);
}
//иначе если файл это файл и длина файла в байтах меньше 50 - добавляем файл в список всех файлов
} else if (FileUtils.isExist(file) && file.isFile() && (file.length() <= 50)) {
fileList.add(file);
}
}
}