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

时间:2018-09-18 11:00:12

标签: java printwriter

我正在尝试使用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();
    }

3 个答案:

答案 0 :(得分:5)

您的代码存在一些问题:

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

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

  3. 您创建打印机,告诉打印机写一些数据,您不要刷新或关闭资源,然后执行另一个过程,最后在该过程完成后,刷新/关。这意味着文件是空的,作为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");
}

答案 1 :(得分:1)

在您调用flush()

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

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

答案 2 :(得分:0)

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

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

关于File参数的部分:

  

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