当前位置: 首页 > 面试题库 >

PrintWriter仅写入部分文本

闽念
2023-03-14
问题内容

由于某种原因,我的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完成工作时,显然文本的一部分丢失了……我一无所知。


问题答案:

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


 类似资料:
  • 问题内容: 我正在编写一种自动提款机程序,该程序会将数据输出到文件中(是​​的,我知道它不是英语,但这不是重点),并且遇到了错误。 当我尝试使用它不起作用时,我不知道为什么。 for循环有效,但各行。这真的让我感到困惑!我已经尝试过)并且得到了,但这仍然无济于事。 有人可以解释我在做什么错吗? 问题答案: 为什么要在writeToFile调用中打开和关闭流?您不应该在for循环之前在writeFo

  • 问题内容: 在阅读有关Java I / O的知识时,我意识到可以通过两种方式写入标准输出。 以下是同时使用这两种技术的代码段 相对于其他使用,是否有任何性能优势? 问题答案: 一个快速的Google透露了Coderanch上的一个线程很有用。 还有其他几种进行控制台编写的方法,但是除了编写更少的代码外,使用一种或另一种似乎没有真正的好处,而且创建新的PrintWriter对象最终会占用更多的内存。

  • 本文向大家介绍dart 仅导入库的一部分,包括了dart 仅导入库的一部分的使用技巧和注意事项,需要的朋友参考一下 示例 如果只想使用一部分库,则可以有选择地导入该库。例如:            

  • 问题内容: 晚上好,我想知道如何清除写入到PrintWriter的数据,即是否可以在打印后从PrintWriter删除数据? 在此servlet中,我在响应中打印一些文本,并在#表示的行上希望删除所有先前打印的数据并打印新内容: 注意:我尝试过out.flush(),但旧的打印文本仍然保留 问题答案: 创建一个内存使用。您可以从获取底层缓冲区,并在需要时清除它。

  • 当我使用JavaMailSender发送带有附件的电子邮件时,它总是失败,并引发以下异常: 这是我的密码

  • 问题内容: 在我的在线计算机科学课上,我必须编写一个程序来确定太阳系中每个行星的表面重力。除了一个方面,我几乎已经掌握了它的所有方面。我需要使用单独的方法将表面重力写入文件。这是我目前的方法: 我的问题是,当我将其写入文件时,它将覆盖先前的值。我如何获得它包括所有的价值。如果有帮助,这是我的全部代码: 问题答案: 这样做是为了创建带有追加模式的作品: