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
相关产品推荐
相关产品推荐

