由于某种原因,我的String部分由PrintWriter编写。结果我在我的文件中得到了部分文本。这是方法:
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");
out.print(text);
} catch (IOException e) {
e.printStackTrace();
}
}
在我将文本打印到控制台的地方,我可以看到数据全部存在,没有任何遗失,但是当PrintWriter完成其工作时,显然部分文本会丢失...我无能为力......
答案 0 :(得分:5)
在丢弃已打开的流之前,您应始终Writer#close
您的流。这将释放JVM在文件系统上打开文件时必须要求的一些相当昂贵的系统资源。如果您不想关闭信息流,可以使用Writer#flush
。这将使您的更改在文件系统上可见,而不关闭流。关闭流时,将隐式刷新所有数据。
Streams总是缓冲数据,以便在有足够的数据写入时只写入文件系统。当流以某种方式考虑数据值得写时,流会不时地自动刷新其数据。写入文件系统是一项昂贵的操作(它需要时间和系统资源),因此只有在确实需要时才应该这样做。因此,如果您希望立即写入,则需要手动刷新流的缓存。
通常,请确保始终关闭流,因为它们使用了相当多的系统资源。 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();
}
}
答案 1 :(得分:2)
尝试在out.flush();
out.print(text);
这是写入文件的正确方法:
public void new_file_with_text(String text, String fname) {
try (FileWriter f = new FileWriter(fname)) {
f.write(text);
f.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 2 :(得分:1)
我测试了你的代码。您忘记关闭PrintWriter对象,即out.close
try {
f = new File(fname);
f.createNewFile();
System.out.println(text);
PrintWriter out = new PrintWriter(f, "UTF-8");
out.print(text);
out.close(); // <--------------
} catch (IOException e) {
System.out.println(e);
}
答案 3 :(得分:0)
你应该关闭你的文件:
PrintWriter out = new PrintWriter(f, "UTF-8");
try
{
out.print(text);
}
finally
{
try
{
out.close();
}
catch(Throwable t)
{
t.printStackTrace();
}
}
答案 4 :(得分:0)
您必须始终关闭您的流(也将刷新它们),在finally块中,或使用Java 7 try-with-resources工具:
PrintWriter out = null;
try {
...
}
finally {
if (out != null) {
out.close();
}
}
或
try (PrintWriter out = new PrintWriter(...)) {
...
}
如果您不关闭流,不仅不会将所有内容刷新到文件中,而且在某些时候,您的操作系统将缺少可用的文件描述符。