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()
之前可能会起作用
您的代码存在一些问题:
您不能将字符串与“==”进行比较,因为“==”比较引用。如果 element.getTagName()
是 "a",您粘贴的第 2 行上的 if
是否实际触发取决于具体情况,但它可能不会。
A PrintWriter
是一种资源。资源需要关闭;如果不关闭它们,资源将无限期地保持打开状态,这称为资源泄漏。使用自动资源管理结构可以方便地完成此操作。
你创建打印器,告诉打印器写一些数据,你不刷新或关闭资源,然后执行另一个进程,最后该过程完成后,您 flush/close。这意味着,该文件是空的,作为打印机缓冲区。你应该写你的文件然后关闭你的资源,然后才调用外部进程;你和你启动的进程同时打开同一个文件会造成混淆和问题,在这种情况下,这是不必要的,所以,不要。
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.
我正在尝试使用 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()
如果您将 flush()
移动到 exec()
您的代码存在一些问题:
您不能将字符串与“==”进行比较,因为“==”比较引用。如果
element.getTagName()
是 "a",您粘贴的第 2 行上的if
是否实际触发取决于具体情况,但它可能不会。A
PrintWriter
是一种资源。资源需要关闭;如果不关闭它们,资源将无限期地保持打开状态,这称为资源泄漏。使用自动资源管理结构可以方便地完成此操作。你创建打印器,告诉打印器写一些数据,你不刷新或关闭资源,然后执行另一个进程,最后该过程完成后,您 flush/close。这意味着,该文件是空的,作为打印机缓冲区。你应该写你的文件然后关闭你的资源,然后才调用外部进程;你和你启动的进程同时打开同一个文件会造成混淆和问题,在这种情况下,这是不必要的,所以,不要。
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.