You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java导出WikiBooks的XML写入文件内容不全如何解决?

问题原因

你的代码运行无报错但文件内容截断,核心原因是没有正确关闭文件输出流:Java的FileWriter自带内存缓冲区,写入的内容会先暂存在缓冲区中,等到缓冲区满后才会自动写入磁盘。你当前代码只关闭了读取XML的输入流,没有关闭写入文件的输出流,程序结束时缓冲区中还没来得及写入磁盘的内容就会丢失,最终呈现为文件中途截断的现象。

解决方法

你可以选择以下任意一种方案修复问题:

  • 写入逻辑结束后主动关闭输出流:在xmlReader.close();代码后增加一行writer.close();即可,关闭流的操作会自动触发缓冲区刷新,把所有剩余内容写入磁盘。
  • 更稳妥的方案是使用Java 7及以上版本支持的try-with-resources语法自动管理所有流资源,不需要手动编写close逻辑,从根本上避免漏关流的问题,优化后的代码示例如下:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

// 提问内容为德语:您想搜索哪本书?
System.out.println("Welches Buch wollen Sie suchen?");
String book = reader.readLine();
book = replaceSpace(book);

URL url = new URL("https://de.wikibooks.org/wiki/Spezial:Exportieren/" + book);
URLConnection uc = url.openConnection();
uc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0");
uc.connect();

// 使用try-with-resources自动管理流,执行完后自动关闭资源
File file = new File("wiki.xml");
try (BufferedReader xmlReader = new BufferedReader(new InputStreamReader(uc.getInputStream()));
     FileWriter writer = new FileWriter(file)) {
    String inputLine;
    while ((inputLine = xmlReader.readLine()) != null) {
        writer.write(inputLine + "\n");
    }
}

内容的提问来源于stack exchange,提问作者Malte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:45:11