PrintWriter стирает файл содержимого перед выполнением функции close () - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь записать содержимое моего разобранного HTML с помощью PrintWriter, чтобы я мог конвертировать 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();
    }

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Есть несколько проблем с вашим кодом:

  1. Невозможно сравнить строки с '==', так как '==' сравнивает ссылки.Если element.getTagName() это «а», то, действительно ли это if в строке 2 вашей вставки, зависит от ситуации, но, вероятно, это не так.

  2. A PrintWriter являетсяресурс.Ресурсы должны быть закрыты;если вы не закроете их, ресурс останется открытым на неопределенный срок, и это называется утечкой ресурса.Используйте конструкцию автоматического управления ресурсами для удобного способа сделать это.

  3. Вы создаете принтер, приказываете принтеру написать некоторые данные, вы не сбрасываете илизакройте ресурс, затем выполните другой процесс и, наконец, после завершения этого процесса вы очистите / закроете.Это значит, что файл пуст, как буфер печати.Вы должны написать свой файл и затем закрыть свой ресурс, и только потом вызывать внешний процесс;и у вас, и у запускаемого вами процесса, когда один и тот же файл открыт одновременно, сбивает с толку и проблематично, и в этом случае ненужный, так что не надо.

  4. Runtime.getRuntime () .exec () НЕ является bash и НЕ является командной строкой.Концепция перенаправления через >> someFile.txt - это bashism / command-promptism.Runtime не знает, о чем вы говорите, и просто передаст его в качестве аргумента запущенному процессу.Вызовите 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");
}
0 голосов
/ 18 сентября 2018

Во-первых: пожалуйста, прочтите попытку понять ответ, который написал rzwitserloot, потому что он содержит некоторую обоснованную конструктивную критику.

Чтобы ответить на ваш вопрос, почему PrintWriter удаляет уже существующее содержимое файла: оно предназначено для этого.Если вы посмотрите документацию для PrintWriter, которую можно найти здесь: https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html#PrintWriter(java.io.File,%20java.lang.String)

Часть о параметре File:

file - файл, который будет использоваться какназначение этого писателя.Если файл существует, он будет обрезан до нулевого размера;в противном случае будет создан новый файл.Вывод будет записан в файл и помещен в буфер.

0 голосов
/ 18 сентября 2018

Нет гарантии, что PrintWriter будет записывать в файл до тех пор, пока вы не вызовете flush()

. Это может работать, если вы переместитесь на flush() до exec()

...