Не записывает данные в файл. Выбрасывает исключение
Задача - записать данные в файл. Файла 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);
}
}
}