【问题标题】:PrintWriter erases file of contents before the close() function executedPrintWriter 在 close() 函数执行之前擦除文件内容
【发布时间】:2018-09-18 11:00:11
【问题描述】:

我正在尝试使用 PrintWriter 编写解析后的 H​​TML 的内容,以便将 HTML 转换为其他格式。但是 PrintWriter 会在 close() 函数执行之前擦除文件的内容——我可以使用其他文件写入技术,但我想知道 PrintWriter 为什么会这样。

for (Element element : elements) {
    if (element.tagName() == "a") {                
        PrintWriter writer2 = new PrintWriter("contenthtml.html", "UTF-8");
        writer2.print(a.ExtractHTMLByIDandDomain(Domain + element.attr("href"), Content_HTML_ID));
        Process proc = Runtime.getRuntime().exec("pandoc -f html -t asciidoc contenthtml.html  >> contentasciidoc.adoc");
        //Thread.sleep(5000); //I have tried wait but it didn't work
        writer2.flush();
        writer2.close();
    }

【问题讨论】:

  • 你能把它打印到第 4 行的 System.out 吗?为什么不在第 4 行之后立即冲洗?

标签: java printwriter


【解决方案1】:

您的代码存在一些问题:

  1. 您不能用 '==' 比较字符串,因为 '==' 比较引用。如果element.getTagName() 是“a”,则粘贴的第 2 行上的 if 是否真的触发取决于具体情况,但可能不会。

  2. PrintWriter 是一种资源。资源需要关闭;如果您不关闭它们,则资源会无限期地保持打开状态,这称为资源泄漏。使用自动资源管理构造是一种方便的方法。

  3. 您创建了 printwriter,告诉 printwriter 写入一些数据,您不要刷新或关闭资源,然后执行另一个进程,最后在该过程完成后,您刷新/关闭。这意味着,文件是空的,作为打印机缓冲区。您应该编写文件然后关闭资源,然后才调用外部进程;你和你启动的进程同时打开同一个文件是令人困惑和有问题的,在这种情况下,没有必要,所以不要。

  4. Runtime.getRuntime().exec() 不是 bash,也不是命令行提示符。通过>> someFile.txt 重定向的概念是一种bashism/command-promptism。运行时不知道你在说什么,只会将它作为参数传递给启动的进程。如果您需要 bash 的重定向功能,请调用 bash,或者通过读取进程的输出流并将其附加到文件中,在 java 中编写重定向。

应用所有 4 个修复:

创建一个名为“run.sh”的文件,其中包含:

#!/bin/sh
pandoc -f html -t asciidoc contenthtml.html >> contentasciidoc.asciidoc

并更新您的 java 代码:

for (Element element : elements) {
    if ("a".equalsIgnoreCase(element.tagName()) {
        try (PrintWriter writer2 = new PrintWriter("contenthtml.html", "UTF-8")) {
            writer2.print(a.ExtractHTMLByIDandDomain(Domain + element.attr("href"), Content_HTML_ID));
        }
    }
    Process proc = Runtime.getRuntime().exec("/usr/bin/bash run.sh");
}

【讨论】:

    【解决方案2】:

    在您调用 flush() 之前,无法保证 PrintWriter 会写入文件

    如果您将flush() 移动到exec() 之前,它可能会起作用

    【讨论】:

      【解决方案3】:

      首先:请阅读尝试理解 rzwitserloot 写的答案,因为它包含一些有效的建设性批评。

      回答您的问题,为什么PrintWriter 会删除已经存在的文件内容:它旨在这样做。如果您查看 PrintWriter 的文档,您可以在这里找到:https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html#PrintWriter(java.io.File,%20java.lang.String)

      关于File参数部分:

      file - 用作此 writer 目标的文件。 如果文件存在,那么它将被截断为零大小;否则,将创建一个新文件。输出将被写入文件并被缓冲。

      【讨论】:

        猜你喜欢
        • 2019-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多