java - PrintWriter 只写部分文本

标签 java printwriter

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

最佳答案

在丢弃打开的流之前,您应该始终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();
    }
}

关于java - PrintWriter 只写部分文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19978597/

相关文章:

java - 使用 @Configuration bean 覆盖 @FeignClient 进行测试

java - System.out上的printWriter之后System.out.println不起作用

java - JDK 1.7错误: Could not find or load main class when using command "java -cp" with multiple jars

java - 无法打开可执行 jar 文件

java - 流媒体问题: Best way to get property out of a List of Lists

java - 继承java构造函数

java - PrintWriter 不写入指定文件

java - 使用自动换行将字符串 ArrayList 打印到 PrintWriter

java - 将实例变量写入文本文件

android - 文件在 PC 上显示为空但在智能手机上显示为非空