我正在尝试使用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();
}
您的代码存在一些问题:
element.getTagName()
是“a”,那么你的粘贴的第2行上的if
是否实际发生取决于情况,但它可能不会。PrintWriter
是一种资源。资源需要关闭;如果你不关闭它们,资源将无限期地保持打开状态,这称为资源泄漏。使用“自动资源管理”构造可以方便地执行此操作。>> 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");
}
在您调用flush()
之前,无法保证PrintWriter会写入该文件
如果你将flush()
移到exec()
之前,它可能会有效
第一:请尝试理解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的目标的文件。如果该文件存在,那么它将被截断为零大小;否则,将创建一个新文件。输出将写入文件并进行缓冲。