PrintWriter 仅写入部分文本

问题描述 投票:0回答:5

由于某种原因,我的字符串部分由 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 完成其工作时,部分文本丢失了。

java printwriter
5个回答
7
投票

在放弃打开的流之前,您应该始终

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(); } }

尝试在该行后面使用 
out.flush();

3
投票
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(); } }

我测试了你的代码。您忘记关闭 PrintWriter 对象,即 out.close

1
投票

您必须始终在finally块中或使用Java 7 try-with-resources工具关闭流(这也会刷新它们):

0
投票

try (PrintWriter out = new PrintWriter(...)) {
    ...
}

如果您不关闭流,不仅不会将所有内容刷新到文件中,而且有时,您的操作系统将没有可用的文件描述符。


您应该关闭您的文件:


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.