【问题标题】:Uncompressed file size in javajava中未压缩的文件大小
【发布时间】:2015-07-16 18:17:49
【问题描述】:

我正在尝试使用以下代码查找未压缩 bz2 文件的大小。但是,运行代码后,我得到的大小为 0 字节。不知道有什么问题。谁能指出来。

try{
                FileInputStream fin = new FileInputStream("/users/praveen/data1/00.json.bz2");
                BufferedInputStream in = new BufferedInputStream(fin);


                BZip2CompressorInputStream bzIn = new BZip2CompressorInputStream(in);
                  long size = 0;
                  while (bzIn.available() > 0)
                  {
                    byte[] buf = new byte[1024];
                    int read = bzIn.read(buf);
                    if (read > 0) size += read;
                  }

                  System.out.println("File Size: " + size + "bytes");
                  bzIn.close();
                //bzIn.close();
                }
                catch (Exception e) {
                throw new Error(e.getMessage());
                } 

【问题讨论】:

  • 首先调试您自己的代码。你有没有进入过while 循环? bunzip2 -c 00.jzon.bz2 | wc -c 的输出是什么?

标签: java bzip2 compression


【解决方案1】:

BZip2CompressorInputStream 很可能没有完全实现available() 方法。它可能只返回 0。相反,您应该尝试使用 InputStream#read(byte[]) 并检查是否返回 -1。

【讨论】:

  • @keerthupraveen 在这种情况下,你应该考虑向维护者提交问题,看看他们是否可以实现available()
  • 一般来说 available() 是不可信的。我怀疑这种情况下的答案是因为我在另一个 InputStream 中看到过它(也许是 CipherInputStream?) 可以正常使用这些流的问题是它通常需要先将一大块数据读入缓冲区然后翻译/解压缩它,这会增加对象/内存分配,否则就不需要了......选择是在最小内存影响和可用实现之间进行选择,他们选择了前者