为什么我似乎无法从 URL 流中读取整个压缩文件?

Why can't I seem to read an entire compressed file from a URL stream?

我正在尝试直接从 Java 中的 URL 动态解析 Wiktionary 转储。 Wiki 转储作为压缩的 BZIP2 文件分发,我正在使用以下方法尝试解析它们:

String fileURL = "https://dumps.wikimedia.org/cswiktionary/20171120/cswiktionary-20171120-pages-articles-multistream.xml.bz2";
URL bz2 = new URL(fileURL);
BufferedInputStream bis = new BufferedInputStream(bz2.openStream());
CompressorInputStream input = new CompressorStreamFactory().createCompressorInputStream(bis);
BufferedReader br2 = new BufferedReader(new InputStreamReader(input));
System.out.println(br2.lines().count());

然而,输出的行数只有 36 行,这只是整个文件的一小部分,因为它的大小超过 20MB。尝试逐行打印流,实际上只打印了 XML 的几行:

String line = br2.readLine();
while(line != null) {
  System.out.println(line);
  line = br2.readLine();
}

这里有我遗漏的东西吗?我从我在网上找到的其他代码块中几乎逐行复制了我的实现,其他人声称这些代码行得通。为什么没有读取整个流?提前致谢。

事实证明,我只是在装傻。 Wiktionary BZIP2 文件是明确的多流(它甚至在文件名中这样说),因此,使用普通 Commons Compress 类 只读取一个流。您需要一个多流 reader 才能读取多流文件,从外观上看,您必须自己编写一个。我遇到了以下对我有用的实现:

https://chaosinmotion.blog/2011/07/29/and-another-curiosity-multi-stream-bzip2-files/

希望这对以后的人有所帮助:)