Данные из файлов не копируются в результирующий файл

Пытаюсь скопировать содержание файлов (txt) из определенной директории в ОДИН файл (txt), но после запуска программы финальный файл остается пустым

import java.io.*;
import java.nio.Buffer;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.EnumSet;
import java.util.Map;
import java.util.TreeMap;

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

public class Solution {
    private static BufferedWriter writer;

    static {
        try (FileWriter fileWriter = new FileWriter("D:\\03_Сережа\\Programming\\tegs.txt")) {
            writer = new BufferedWriter(fileWriter);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) throws IOException {
        String pathStr = "D:\\03_Сережа\\Programming\\testFolder";
        String resultFileAbsolutePathStr  = "D:\\03_Сережа\\Programming\\tegs.txt";
        File path = new File(pathStr);
        File resultFileAbsolutePath = new File(resultFileAbsolutePathStr);
        FileUtils.renameFile(resultFileAbsolutePath, new File(resultFileAbsolutePath.getParent() + "//rename.txt"));
        getFiles(path);
    }

    public static void getFiles(File currentFolder) throws IOException {
        for (File isFile : currentFolder.listFiles()) {
            //if (isFile.isFile() && isFile.getName().equals("allFilesContent.txt")) continue;
            if (isFile.isFile()) {
                writer.write("new file\n");
                if (isFile.length() < 50) {
                    try (BufferedReader reader = new BufferedReader(new FileReader(isFile))) {
                        while (reader.ready()) {
                            writer.write(reader.readLine());
                        }
                        writer.write("\n");
                    }
                }
            } else {
                getFiles(isFile);
            }
        }
    }
}

class FileUtils {

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

    public static void renameFile(File source, File destination) {
        if (!source.renameTo(destination)) System.out.println("Can not rename file with name " + source.getName());
    }

    public static boolean isExist(File file) {
        return file.exists();
    }
}

Ответы (1 шт):

Автор решения: Nowhere Man

У вас не будет выполняться запись в файл, так как поток FileWriter fileWriter в блоке статической инициализации закрывается сразу же после выхода из данного блока, поскольку используется в try-with-resources, соответственно статическое поле BufferedWriter writer будет обёрткой для закрытого потока.

И тогда, если просто попытаться закрыть поток writer после вызова метода getFiles, будет выброшено исключение:

java.io.IOException: Stream closed
...
at java.base/java.io.BufferedWriter.close(BufferedWriter.java:380)

Поэтому в данном коде следует исправить следующие моменты:

  • убрать статическое поле BufferedWriter writer и его инициализацию
  • перенести создание выходного потока в блок try-with-resources в методе main, чтобы обеспечить его автоматическое закрытие и запись буфера в выходной файл
  • добавить входной параметр writer в метод getFiles
  • при записи содержимого файлов добавить вывод новой строки, иначе содержимое всех файлов будет выводиться в одну строку:
public class Solution {

    public static void main(String[] args) throws IOException {
        String pathStr = "D:\\03_Сережа\\Programming\\testFolder";
        String resultFileAbsolutePathStr  = "D:\\03_Сережа\\Programming\\tegs.txt";
        File path = new File(pathStr);
        File resultFileAbsolutePath = new File(resultFileAbsolutePathStr);
        FileUtils.renameFile(resultFileAbsolutePath, new File(resultFileAbsolutePath.getParent() + "//rename.txt"));
        try (BufferedWriter writer = new BufferedWriter(new FileWriter("D:\\03_Сережа\\Programming\\tegs.txt"))) {
            getFiles(writer, path);
        }
    }

    public static void getFiles(BufferedWriter writer, File currentFolder) throws IOException {
        for (File isFile : currentFolder.listFiles()) {
            //if (isFile.isFile() && isFile.getName().equals("allFilesContent.txt")) continue;
            if (isFile.isFile()) {
                writer.write("new file\n");
                if (isFile.length() < 50) {
                    try (BufferedReader reader = new BufferedReader(new FileReader(isFile))) {
                        while (reader.ready()) {
                            writer.write(reader.readLine());
                            writer.newLine(); // добавить вывод новой строки
                        }
                        writer.write("\n");
                    }
                }
            } else {
                getFiles(writer, isFile);
            }
        }
    }
}
→ Ссылка