簡體   English   中英

Java:將使用Jsoup解析的多個文件的結果寫入文本文件

[英]Java : write results from multiple files parsed with Jsoup to text file

我在一個文件夾中有多個html文件:下面的代碼列出了所有文件,然后用Jsoup解析它們:我沒有成功將所有用Jsoup解析的文件的結果寫入文本文件:我只得到了最后解析的文件。 怎么了 ?

代碼是:

package jsouppackage;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Main {

    public static void main(String[] args) {
        File input = new File("C:/html");
        File[] st = input.listFiles();
        for (int i = 0; i < st.length; i++) {
            if(st[i].isFile()){
                parse(st[i]);
            }
        }

    }

    private static void parse(File input ) {
        Document doc;

        try{

            doc = Jsoup.parse(input, "UTF-8", "");


            Elements ids = doc.select("div[id^=osdi] p");
            PrintWriter out = new PrintWriter("C:/html/output/output.txt", "UTF-8");

            for (Element id : ids){

                out.println("\n"+id.text());

            }
            out.close();

        }catch(IOException e){

        }
    }
}

謝謝你的幫助

每次調用

PrintWriter out = new PrintWriter("C:/html/output/output.txt", "UTF-8");

您正在創建新文件(這意味着舊文件已刪除)。 您想要的是讓writer將數據附加到現有文件,或者如果不存在則創建一個。

因此,如果您想設置編碼,則可以使用

OutputStreamWriter(OutputStream out, String charsetName)

由於它接受OutputStream而不是Writer,因此可以將文件設置為輸出並使其追加使用

FileOutputStream(String name, boolean append)

您將append參數設置為true


換句話說,您可以使用

String outputFile = "C:/html/output/output.txt";
FileOutputStream fos = new FileOutputStream(outputFile, true);
PrintWriter out = new PrintWriter(new OutputStreamWriter(fos, "UTF-8"));

或為提高性能而使用BufferedWriter裝飾器添加緩沖

String outputFile = "C:/html/output/output.txt";
FileOutputStream fos = new FileOutputStream(outputFile, true);
PrintWriter out = new PrintWriter(new BufferedWriter(
        new OutputStreamWriter(fos, "UTF-8")));

順便說一句,您不應該在try塊中關閉編寫器/閱讀器/流。 您應該在finally塊中執行此操作。 為了使事情變得容易,您可以使用try-with-resources。 也不要將catch塊留空,至少要使用e.printStackTrace();至少打印有關拋出異常的信息e.printStackTrace();

所以你的解析方法看起來像

private static void parse(File input) {

    String outputFile = "C:/html/output/output.txt";

    try (FileOutputStream fos = new FileOutputStream(outputFile, true);
         PrintWriter      out = new PrintWriter(new BufferedWriter(
                    new OutputStreamWriter(fos, "UTF-8")))) {

        Document doc = Jsoup.parse(input, "UTF-8", "");
        Elements ids = doc.select("div[id^=osdi] p");

        for (Element id : ids) {
            out.println("\n" + id.text());
        }
        //out.close(); // this will be invoked automatically now
    } catch (IOException e) {
        e.printStackTrace();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM