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

Java PrintWriter在执行close()函数之前擦除文件内容,java,printwriter,Java,Printwriter,我试图用PrintWriter编写解析后的HTML内容,以便将HTML转换为其他格式。但是PrintWriter会在执行close()函数之前擦除文件内容,我可以使用其他文件写入技术,但我想知道为什么PrintWriter会这样做 for (Element element : elements) { if (element.tagName() == "a") { PrintWriter writer2 = new 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();
    }

在调用
flush()


如果将
flush()
移动到
exec()

之前,它可能会工作。在调用
flush()


如果将
flush()
移动到
exec()

之前,它可能会起作用。您的代码有一些问题:

  • 无法将字符串与“==”进行比较,因为“==”比较引用。如果
    element.getTagName()
    是“a”,那么粘贴的第2行上的
    If
    是否实际触发取决于具体情况,但可能不会

  • PrintWriter
    是一种资源。需要关闭资源;如果不关闭它们,资源将无限期地保持打开状态,这称为资源泄漏。使用自动资源管理结构可以方便地执行此操作

  • 创建printwriter,让printwriter写入一些数据,不刷新或关闭资源,然后执行另一个进程,最后在该进程完成后,刷新/关闭。也就是说,文件是空的,因为printwriter缓冲区是空的。您应该先编写文件,然后关闭资源,然后才调用外部进程;您和您启动的进程同时打开同一个文件是令人困惑和有问题的,在这种情况下,这是不必要的,因此,不要这样做

  • Runtime.getRuntime().exec()不是bash,也不是命令行提示符。通过someFile.txt重定向的概念是一种bashism/command-promptism。运行时不知道您在谈论什么,只会将其作为参数传递给启动的进程。如果需要bash的重定向功能,可以调用bash,或者通过读取进程的outputstream并自己将其附加到文件中,用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");
    }
    

    您的代码存在一些问题:

  • 无法将字符串与“==”进行比较,因为“==”比较引用。如果
    element.getTagName()
    是“a”,那么粘贴的第2行上的
    If
    是否实际触发取决于具体情况,但可能不会

  • PrintWriter
    是一种资源。需要关闭资源;如果不关闭它们,资源将无限期地保持打开状态,这称为资源泄漏。使用自动资源管理结构可以方便地执行此操作

  • 创建printwriter,让printwriter写入一些数据,不刷新或关闭资源,然后执行另一个进程,最后在该进程完成后,刷新/关闭。也就是说,文件是空的,因为printwriter缓冲区是空的。您应该先编写文件,然后关闭资源,然后才调用外部进程;您和您启动的进程同时打开同一个文件是令人困惑和有问题的,在这种情况下,这是不必要的,因此,不要这样做

  • Runtime.getRuntime().exec()不是bash,也不是命令行提示符。通过someFile.txt重定向的概念是一种bashism/command-promptism。运行时不知道您在谈论什么,只会将其作为参数传递给启动的进程。如果需要bash的重定向功能,可以调用bash,或者通过读取进程的outputstream并自己将其附加到文件中,用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
    ,您可以在此处找到:

    关于
    文件
    参数的部分:

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


    第一:请阅读一篇试图理解rzwitserloot所写的答案的文章,因为它包含了一些有效的建设性批评

    要回答您的问题,为什么
    PrintWriter
    会删除现有的文件内容:它就是这样设计的。如果您在文档中查找
    PrintWriter
    ,您可以在此处找到:

    关于
    文件
    参数的部分:

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


    你能把它打印到第4行的System.out吗?为什么不在第4行之后立即冲洗?可以将其打印到第4行的System.out吗?你为什么不在四号线后马上冲水呢?