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

问题描述 投票:1回答:3

我正在尝试使用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();
    }
java printwriter
3个回答
5
投票

您的代码存在一些问题:

  1. 您无法将字符串与'=='进行比较,因为'=='会比较引用。如果element.getTagName()是“a”,那么你的粘贴的第2行上的if是否实际发生取决于情况,但它可能不会。
  2. PrintWriter是一种资源。资源需要关闭;如果你不关闭它们,资源将无限期地保持打开状态,这称为资源泄漏。使用“自动资源管理”构造可以方便地执行此操作。
  3. 您创建了printwriter,告诉printwriter写一些数据,不刷新或关闭资源,然后执行另一个进程,最后在该进程完成后,刷新/关闭。这意味着,文件为空,因为printwriter缓冲。您应该编写文件然后关闭资源,然后再调用外部进程;您和同时打开同一文件的同时启动的进程令人困惑且有问题,在这种情况下,不必要,所以不要。
  4. Runtime.getRuntime()。exec()不是bash而不是命令行提示符。通过>> someFile.txt重定向的概念是一种基础/命令提示。运行时不知道你在说什么,只是将它作为参数传递给已启动的进程。如果您需要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
投票

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

如果你将flush()移到exec()之前,它可能会有效


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 - 要用作此writer的目标的文件。如果该文件存在,那么它将被截断为零大小;否则,将创建一个新文件。输出将写入文件并进行缓冲。

© www.soinside.com 2019 - 2024. All rights reserved.