Вы должны всегда Writer#close
ваших потоков перед тем, как отбросить открытые потоки. Это избавит вас от некоторых довольно дорогостоящих системных ресурсов, которые должна запрашивать ваша JVM при открытии файла в файловой системе. Если вы не хотите закрыть свой поток, вы можете использовать Writer#flush
. Это сделает ваши изменения видимыми в файловой системе, не закрывая поток. При закрытии потока все данные скрываются неявно.
Потоки всегда буферизуют данные, чтобы записывать только в файловую систему, когда есть достаточно данных для записи. Поток автоматически обновляет свои данные каждый раз, а затем, когда он каким-то образом рассматривает данные , стоит написать. Запись в файловую систему - это дорогостоящая операция (она требует времени и системных ресурсов), и поэтому ее нужно делать только в том случае, если это действительно необходимо. Поэтому вам необходимо вручную очистить кеш потока, если вы хотите немедленную запись.
В целом, убедитесь, что вы всегда тесные потоки, так как они используют довольно некоторые системные ресурсы. Java имеет некоторые механизмы для закрытия потоков в сборке мусора, но эти механизмы следует рассматривать только как последнее средство, поскольку потоки могут жить довольно долго, прежде чем они будут фактически собраны мусором. Поэтому всегда используйте try {} finally {}
, чтобы убедиться, что потоки закрыты даже на исключениях после открытия потока. Если вы не обратили на это внимание, вы получите сообщение IOException
о том, что вы открыли слишком много файлов.
Вы хотите изменить свой код так:
public void new_file_with_text(String text, String fname) {
File f = null;
try {
f = new File(fname);
f.createNewFile();
System.out.println(text);
PrintWriter out = new PrintWriter(f, "UTF-8");
try {
out.print(text);
} finally {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
... или в блоке 'finally', а также' out.close() '! –