Метод постоянно выбрасывает исключение. Метод наполняет исходящие файлы данными, принимая @param PathsIn, коллекцию путей исходящих файлов

Рейтинг: -2Ответов: 1Опубликовано: 16.01.2023
public static void fillTheFiles() {
        System.out.println("Введите входные данные:");
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        for (String path : Starter.getPathsIn()) {
            try (BufferedWriter bufferedWriter = Files.newBufferedWriter(Path.of(path), StandardCharsets.UTF_8)) {
                String line;
                while (!"quit".equalsIgnoreCase(line = bufferedReader.readLine())) {
                    bufferedWriter.append(line);
                    bufferedWriter.append("\n");
                }
            } catch (IOException e) {
                System.err.println("Нет доступа к пути " + path);
                e.printStackTrace();
            }
        }
    }

Метод должен Считывать с консоли и записывать ее в файлы, пути которых хранятся в коллекции

Нет доступа к пути 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.DataMaker.fillTheFiles(DataMaker.java:93)
    at CFT.Main.main(Main.java:12)
Нет доступа к пути C:\Users\Anna\OneDrive\Рабочий стол\Java\Shift\Shift\in2.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.DataMaker.fillTheFiles(DataMaker.java:93)
    at CFT.Main.main(Main.java:12)

Process finished with exit code 0


Ответы

▲ 0

Данная ошибка НЕ воспроизводится в представленном коде.

Однако, не исключено что входной поток System.in закрывается в каком-нибудь другом методе, что и вызывает исключение java.io.IOException: Stream closed, например, из-за использования try-with-resources.

Слегка модифицированная версия кода с добавленными отладочными сообщениями:

public static void fillTheFiles() {
    System.out.println("Введите входные данные:");
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    for (String path : Starter.getPathsIn()) {
        try (BufferedWriter bufferedWriter = Files.newBufferedWriter(Path.of(path), StandardCharsets.UTF_8)) {
            System.out.println("Начинаем запись в файл: " + path);
            String line;
            while (!"quit".equalsIgnoreCase(line = bufferedReader.readLine())) {
                bufferedWriter.append(line);
                bufferedWriter.append("\n");
            }
            System.out.println("Запись в файл: " + path + " успешно завершена");
        } catch (IOException e) {
            System.err.println("Нет доступа к пути " + path);
            e.printStackTrace();
        }
    }
}

static class Starter {
    static List<String> getPathsIn() {
        return Arrays.asList("out1.txt", "out2.txt", "out3.txt");
    }

}

public static void main(String[] args) {
    fillTheFiles();
}

Тест: содержимое консоли:

Введите входные данные:
Начинаем запись в файл: out1.txt
111 222
333 444
555 666
йгше
quit
Запись в файл: out1.txt успешно завершена
Начинаем запись в файл: out2.txt
zzz xxx yyy uuu
ccc bbb aaa ddd
010101
quit
Запись в файл: out2.txt успешно завершена
Начинаем запись в файл: out3.txt
asdf qwer
zxcx vbvbv
ФЫВА ОЛДЖ!
quit
Запись в файл: out3.txt успешно завершена

Process finished with exit code 0

введите сюда описание изображения