我正在尝试使用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();
}
答案 0 :(得分:5)
您的代码存在一些问题:
您不能将带有'=='的字符串进行比较,因为'=='会比较引用。如果element.getTagName()
是“ a”,则粘贴情况的第2行上的if
是否实际触发取决于情况,但这可能不会。
PrintWriter
是一种资源。资源需要关闭;如果不关闭它们,资源将无限期保持打开状态,这称为资源泄漏。使用自动资源管理构造可以方便地实现此目的。
您创建打印机,告诉打印机写一些数据,您不要刷新或关闭资源,然后执行另一个过程,最后在该过程完成后,刷新/关。这意味着文件是空的,作为printwriter缓冲区。您应该先编写文件,然后关闭资源,然后才调用外部进程。您和您启动的同时打开同一文件的过程都会造成混乱和问题,在这种情况下,这是不必要的,所以不必。
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()
如果您将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-用作此编写器目标的文件。 如果文件存在,那么它将被截断为零大小;否则,将创建一个新文件。输出将被写入文件并被缓冲。