使用Java Apache Commons下载文件?

使用Java Apache Commons下载文件?,第1张

使用Java Apache Commons下载文件?

如果您正在寻找一种在下载之前获取字节总数的方法,则可以从

Content-Length
http响应的标头中获取此值。

如果只需要下载后的最终字节数,则最简单的方法就是检查刚刚写入的文件大小。

但是,如果要显示当前已下载多少字节的进度,则可能需要扩展apache

CountingOutputStream
来包装,
FileOutputStream
以便每次
write
调用方法时,它都会计算通过的字节数并更新进度条。

更新资料

这是的简单实现

DownloadCountingOutputStream
。我不确定您是否熟悉使用
ActionListener
它,但是它对于实现GUI是有用的。

public class DownloadCountingOutputStream extends CountingOutputStream {    private ActionListener listener = null;    public DownloadCountingOutputStream(OutputStream out) {        super(out);    }    public void setListener(ActionListener listener) {        this.listener = listener;    }    @Override    protected void afterWrite(int n) throws IOException {        super.afterWrite(n);        if (listener != null) { listener.actionPerformed(new ActionEvent(this, 0, null));        }    }}

这是用法示例:

public class Downloader {    private static class ProgressListener implements ActionListener {        @Override        public void actionPerformed(ActionEvent e) { // e.getSource() gives you the object of DownloadCountingOutputStream // because you set it in the overriden method, afterWrite(). System.out.println("Downloaded bytes : " + ((DownloadCountingOutputStream) e.getSource()).getByteCount());        }    }    public static void main(String[] args) {        URL dl = null;        File fl = null;        String x = null;        OutputStream os = null;        InputStream is = null;        ProgressListener progressListener = new ProgressListener();        try { fl = new File(System.getProperty("user.home").replace("\", "/") + "/Desktop/Screenshots.zip"); dl = new URL("http://ds-forums.com/kyle-tests/uploads/Screenshots.zip"); os = new FileOutputStream(fl); is = dl.openStream(); DownloadCountingOutputStream dcount = new DownloadCountingOutputStream(os); dcount.setListener(progressListener); // this line give you the total length of source stream as a String. // you may want to convert to integer and store this value to // calculate percentage of the progression. dl.openConnection().getHeaderField("Content-Length"); // begin transfer by writing to dcount, not os. IOUtils.copy(is, dcount);        } catch (Exception e) { System.out.println(e);        } finally { IOUtils.closeQuietly(os); IOUtils.closeQuietly(is);        }    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5429176.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存