2012-08-25 32 views
5

我在我的Java应用程序中下载了一些文件并实现了一个下载监视器对话框。但最近我用gzip压缩了所有的文件,现在下载监视器有点坏了。监视器GZip下载Java中的进度

我将文件打开为GZIPInputStream,并在每下载一次kB后更新下载状态。如果该文件具有1MB的大小,则进展达到例如4MB这是未压缩的大小。我想监视压缩的下载进度。这可能吗?

编辑:澄清:我正在读取未压缩字节的GZipInputStream中的字节。所以这最终没有给我正确的文件大小。

这里是我的代码:

URL url = new URL(urlString); 
HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
con.connect(); 
... 
File file = new File("bibles/" + name + ".xml"); 
if(!file.exists()) 
    file.createNewFile(); 
out = new FileOutputStream(file); 
in = new BufferedInputStream(new GZIPInputStream(con.getInputStream())); 

byte[] buffer = new byte[1024]; 
int count; 
while((count = in.read(buffer)) != -1) { 
    out.write(buffer, 0, count); 
    downloaded += count; 
    this.stateChanged(); 
} 

... 

private void stateChanged() { 
    this.setChanged(); 
    this.notifyObservers(); 
} 

感谢您的帮助!

+0

我正在读取由未压缩流的'GZipInputStream'下载的字节。所以这不是真正的下载文件大小。 – dbrettschneider

+0

好吧,现在我明白了。 – SJuan76

回答

4

根据说明书,GZIPInputStreamInflaterInputStream的子类。 InflaterInputStream有一个protected Inflater inf字段,即用于解压缩工作的InflaterInflater.getBytesRead应该对你的目的特别有用。

不幸的是,GZIPInputStream没有公开inf,因此您可能需要创建自己的子类并公开Inflater,例如,

public final class ExposedGZIPInputStream extends GZIPInputStream { 

    public ExposedGZIPInputStream(final InputStream stream) { 
    super(stream); 
    } 

    public ExposedGZIPInputStream(final InputStream stream, final int n) { 
    super(stream, n); 
    } 

    public Inflater inflater() { 
    return super.inf; 
    } 
} 
... 
final ExposedGZIPInputStream gzip = new ExposedGZIPInputStream(...); 
... 
final Inflater inflater = gzip.inflater(); 
final long read = inflater.getBytesRead(); 
+0

谢谢!我只需要实现一个自定义的GZIPInputStream,使得'Inflater int'的'getBytesRead()'可用。 – dbrettschneider

+0

谢谢,这正是我一直在寻找的! –