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 完成它的工作时,显然部分文本丢失了......我一无所知..

4

5 回答 5

6

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();
    }
}
于 2013-11-14T13:19:13.907 回答
3

尝试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();
    }
}
于 2013-11-14T13:16:57.987 回答
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);
    }
于 2013-11-14T13:24:17.500 回答
0

你应该关闭你的文件:

PrintWriter out = new PrintWriter(f, "UTF-8");
try
{
        out.print(text);
}
finally
{
    try
    {
        out.close();
    }
    catch(Throwable t)
    {
        t.printStackTrace();
    }
}
于 2013-11-14T13:20:52.570 回答
0

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

PrintWriter out = null;
try {
    ...
}
finally {
    if (out != null) {
        out.close();
    }
}

或者

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

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

于 2013-11-14T13:20:57.737 回答