Данные из файлов не копируются в результирующий файл
Пытаюсь скопировать содержание файлов (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);
}
}
}
}