【问题标题】:Java write to fileJava 写入文件
【发布时间】:2016-03-30 02:59:26
【问题描述】:
public class Main {
    public static String title;
    public static String text;

    public static void main(String[] args) throws IOException {
        Document doc = Jsoup.connect("http://support.cygnos.xyz/zast.html").get();
        Elements kolumny = doc.select("tr");
        title = doc.title();
        System.out.println("===== " + title + "=====\n");
        for (Element szczegolowe : kolumny) { 
            System.out.println(szczegolowe.text());
            text = szczegolowe.text();
            PrintWriter out = new PrintWriter(new FileWriter("last.txt"));
            out.println(szczegolowe.text());
            out.flush();
            out.close();
        }
    }
}

为什么这只会生成一行文件,而不是我解析的表中的完整数据?

控制台输出:

http://support.cygnos.xyz/output.txt

文件:

7 3 TIE(3) - 20ZS L.拉科伊奇

【问题讨论】:

  • 你认为PrintWriter out = new PrintWriter(new FileWriter("last.txt")); 是做什么的?你确定它的位置在循环内吗?关于out.close();的同样问题

标签: java


【解决方案1】:

在循环之外创建您的编写器,否则您将每次都覆盖该文件。

此外,在完成写入文件后,在循环之后关闭写入器。

PrintWriter out = new PrintWriter(new FileWriter("last.txt"));

for (Element szczegolowe : kolumny) { 
        System.out.println(szczegolowe.text());
        text = szczegolowe.text();

        out.println(szczegolowe.text());
        out.flush();

}

out.close();

【讨论】:

  • 您实际上可以在每行之后刷新,但您是对的,我们也可以在关闭之前刷新一次。
  • @Berger "我们也可以在关闭前刷新一次" close 方法不会自动刷新吗?我们真的需要在close 之前显式调用flush 吗?
  • @Pshemo :本示例中使用的 PrintWriter 构造函数的 javadoc 说:“创建一个新的 PrintWriter,而不自动刷新行。” .但是,这里有一个讨论:stackoverflow.com/questions/9927281/…
  • @Berger 我不是在询问每行之后的刷新,而是在close 方法之前的刷新。如果这是我们想要的,在每行之后手动刷新是可以的。但是在close() 之前刷新是我记得多余的。
  • @Pshemo :是的,这可能是多余的,我不记得不使用 flush() 时有任何问题。
【解决方案2】:

因为您确实在 for 循环中打开文件并关闭它,使其擦除其内容并仅写入最后一行。要使其正常工作,请打开文件并仅关闭一次(在循环外):

PrintWriter out = new PrintWriter(new FileWriter("last.txt"));
for (Element szczegolowe : kolumny) { 
        System.out.println(szczegolowe.text());
        text = szczegolowe.text();
        out.println(szczegolowe.text());
}
out.flush();
out.close();

【讨论】:

    【解决方案3】:

    您正在为循环中的每次迭代初始化一个新的PrintWriter,导致文件被一次又一次地截断。

    也许解决方案是在循环之前初始化PrintWriter,然后在循环内写入并在之后关闭它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      • 2012-12-11
      • 2014-08-01
      • 2016-01-30
      相关资源
      最近更新 更多