• ,

коварный валидатор не пропускает задачу "Проход по дереву файлов" task31.task3101

вот условие задачи:

1. На вход метода main подаются два параметра.

Первый — path — путь к директории, второй — resultFileAbsolutePath — имя существующего файла, который будет содержать результат.

2. Для каждого файла в директории path и в ее всех вложенных поддиректориях выполнить следующее:

2.1. Если у файла длина в байтах больше 50, то удалить его (используй метод FileUtils.deleteFile).

2.2. Если у файла длина в байтах НЕ больше 50, то для всех таких файлов:

2.2.1. Отсортировать их по имени файла в возрастающем порядке, путь не учитывать при сортировке.

2.2.2. Переименовать resultFileAbsolutePath в ‘allFilesContent.txt‘ (используй метод FileUtils.renameFile).

2.2.3. В allFilesContent.txt последовательно записать содержимое всех файлов из п. 2.2.1. После каждого тела файла записать "\n".

Все файлы имеют расширение txt.

Требования:

1. Файл, который приходит вторым параметром в main, должен быть переименован в allFilesContent.txt.

2. Нужно создать поток для записи в переименованный файл.

3. Пройдись по всем файлам в директории, которая приходит первым параметром в main, и всех ее поддиректориях. Файлы с размером более 50 байт нужно удалить используя метод FileUtils.deleteFile.

4. Содержимое всех файлов, размер которых не превышает 50 байт, должно быть записано в файл allFilesContent.txt в отсортированном по имени файла порядке.

5. Поток для записи в файл нужно закрыть.

вот мое решение:

package com.javarush.task.task31.task3101;

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/*
Проход по дереву файлов
*/
public class Solution {
    public static List<File> smallFiles = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        File path = new File(args[0]);
        File resultFileAbsolutePath = new File(args[1]);
        File newFile;
        if(resultFileAbsolutePath.getParent()==null){
            newFile = new File("allFilesContent.txt");
        }else newFile = new File(resultFileAbsolutePath.getParent() + "\\allFilesContent.txt");

        FileUtils.renameFile(resultFileAbsolutePath, newFile);

        FileOutputStream fileOutputStream = new FileOutputStream(newFile);

        checkDir(path);

        Collections.sort(smallFiles, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });

        for(File files:smallFiles){
            FileInputStream fileInputStream = new FileInputStream(files);
            while (fileInputStream.available() > 0){
                fileOutputStream.write(fileInputStream.read());
            }
            fileOutputStream.write('\n');
            fileOutputStream.flush();
            fileInputStream.close();
        }

        fileOutputStream.close();
    }

    public static void checkDir(File file){
        for(File fileList:file.listFiles()){
            if(fileList.isDirectory())checkDir(fileList);
            if(fileList.isFile()){

                if(fileList.length() > 50){
                    FileUtils.deleteFile(fileList);
                }else {
                    smallFiles.add(fileList);
                }
            }
        }
    }

    public static void deleteFile(File file) {
        if (!file.delete()) System.out.println("Can not delete file with name " + file.getName());
    }
}


валидатору все нравится, кроме пункта: «Поток для записи в файл нужно закрыть.» почему он так считает я не понимаю!
вдобавок, уже меня смущает тот факт, что, в моем случае, содержимое всех файлов записывается в одну строку, хотя после записи каждого тела файла я вставляю строку

fileOutputStream.write('\n');


кто может объяснить, где я ошибаюсь?