Не записывает данные в файл. Выбрасывает исключение

Рейтинг: 0Ответов: 1Опубликовано: 13.01.2023

Задача - записать данные в файл. Файла 3 шт, и они лежат в коллекции pathsIn. Идея - пройтись по всем paths и сделать записи. Закончить запись данных думал по кодовому слову "command".

public void fillTheFiles(ArrayList<Path> pathsIn) {
        System.out.println("Введите входные данные:");
        for (int i = 0; i < pathsIn.size(); i++) {
            try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(String.valueOf(pathsIn.get(i)))))
            {
                String command = "wr";
                String line = null;
                do {
                    line = bufferedReader.readLine();
                    bufferedWriter.append(line);
                    bufferedWriter.append("\n");
                }
                while (!line.equals(command));
            } catch (IOException e) {
                System.err.println("Can't write to file with path " + pathsIn.get(i));
            }
        }
    }

Выбрасывается исключение:

Can't write to file with path C:\Users\Anna\OneDrive\Рабочий стол\Java\Shift\Shift\in.txt

Лог ошибок

java.io.IOException: Stream closed
    at java.base/java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:168)
    at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:334)
    at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:270)
    at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:313)
    at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
    at java.base/java.io.InputStreamReader.read(InputStreamReader.java:177)
    at java.base/java.io.BufferedReader.fill(BufferedReader.java:162)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:329)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:396)
    at CFT.Starter.fillTheFiles(Starter.java:137)
    at CFT.Main.main(Main.java:8)
java.io.IOException: Stream closed
    at java.base/java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:168)
    at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:334)
    at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:270)
    at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:313)
    at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
    at java.base/java.io.InputStreamReader.read(InputStreamReader.java:177)
    at java.base/java.io.BufferedReader.fill(BufferedReader.java:162)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:329)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:396)
    at CFT.Starter.fillTheFiles(Starter.java:137)
    at CFT.Main.main(Main.java:8)
java.io.IOException: Stream closed
    at java.base/java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:168)
    at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:334)
    at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:270)
    at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:313)
    at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
    at java.base/java.io.InputStreamReader.read(InputStreamReader.java:177)
    at java.base/java.io.BufferedReader.fill(BufferedReader.java:162)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:329)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:396)
    at CFT.Starter.fillTheFiles(Starter.java:137)
    at CFT.Main.main(Main.java:8)

Process finished with exit code 0

Ответы

▲ 1Принят

Если вы открыли поток ввода на основании System.in, то НЕ нужно закрывать его, так как System.in будет также непоправимо закрыт и из него нельзя будет больше читать данные.

Именно это у вас происходит в цикле при использовании try-with-resources.

Попробуйте использовать один поток ввода c некой командой/признаком окончания ввода в один файл, например, quit.

Также при использовании "нового" API ввода/вывода лучше пользоваться соответствующим методом Files.newBufferedWriter для открытия потока вывода, или хотя бы new BufferedWriter(new FileWriter(path.toFile()))

public void fillTheFiles(ArrayList<Path> pathsIn) {
    System.out.println("Введите входные данные:");
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    for (Path path : pathsIn) {
        try (BufferedWriter bufferedWriter = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
            String command = "wr";
            String line;
            while (!"quit".equalsIgnoreCase(line = bufferedReader.readLine())) {
                bufferedWriter.append(line);
                bufferedWriter.append("\n");
            }            
        } catch (IOException e) {
            System.err.println("Can't write to file with path " + path);
        }
    }
}