【问题标题】:Why can't I seem to read an entire compressed file from a URL stream?为什么我似乎无法从 URL 流中读取整个压缩文件?
【发布时间】:2018-05-09 11:16:26
【问题描述】:

我正在尝试使用 Java 直接从 URL 动态解析维基词典的转储。 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();
}

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

【问题讨论】:

    标签: java stream inputstream bzip2 wikidata


    【解决方案1】:

    所以事实证明,我只是愚蠢。维基词典 BZIP2 文件是明确的多流(它甚至在文件名中这样说),因此,使用 vanilla Commons Compress 类只读取一个流。您需要一个多流阅读器才能读取多流文件,从外观上看,您必须自己编写一个。我遇到了以下对我有用的实现:

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

    希望这对将来的人有所帮助:)

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多