PrintWriter 在执行 close() 函数之前擦除文件内容

PrintWriter erases file of contents before the close() function executed

我正在尝试使用 PrintWriter 写入已解析的 HTML 的内容,以便将 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();
    }

在您调用 flush()

之前,无法保证 PrintWriter 会写入文件

如果您将 flush() 移动到 exec()

之前可能会起作用

您的代码存在一些问题:

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

  2. A PrintWriter 是一种资源。资源需要关闭;如果不关闭它们,资源将无限期地保持打开状态,这称为资源泄漏。使用自动资源管理结构可以方便地完成此操作。

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

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

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

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

关于File参数的部分:

file - The file to use as the destination of this writer. If the file exists then it will be truncated to zero size; otherwise, a new file will be created. The output will be written to the file and is buffered.