我在我的java应用程序中下载了一些文件并实现了下载监视器对话框。但是最近我用gzip压缩了所有文件,现在下载监视器已经坏了。
我将文件作为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 :(得分:4)
根据规范,GZIPInputStream
是InflaterInputStream
的子类。 InflaterInputStream
有一个protected Inflater inf
字段,用于解压缩工作的Inflater
。 Inflater.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();