使用FileUtils下载时,使用进度条

时间:2016-05-02 11:00:32

标签: java fileutils progressmonitor

我尝试使用 commons.io Apache库从URL下载大文件。 这是我的代码:

    InputStream stream = new URL(CLIENT_URL).openStream();
    ProgressMonitorInputStream pmis = new ProgressMonitorInputStream(null, "Downloading...", stream);
    ProgressMonitor pm = pmis.getProgressMonitor();
    pm.setMillisToDecideToPopup(0);
    pm.setMillisToPopup(0);
    FileUtils.copyInputStreamToFile(pmis, new File(LATEST_FILENAME));
    pmis.close();
    stream.close();

但它没有显示弹出窗口。或者,说实话,弹出窗口仅在毫秒时出现和消失,而下载大约需要10秒。

1 个答案:

答案 0 :(得分:4)

通用InputStream不提供有关当前位置或外部世界总长度的信息。见InputStream availiable()不是InputStream的总大小,也没有获取当前位置或获得总大小等内容。您也可能只读取流的块/部分,甚至进度条也能够计算出流的总长度,它不会知道您只会读取例如512字节。

ProcessMonitorInputStream修饰提供的InputStream并在读取操作期间更新对话框的进度条。默认情况下,ProgressMonitorInputStream使用available的{​​{1}}来初始化InputStream的最大值。某些ProgressMonitor的值可能正确,但在通过网络传输数据时尤其如此。

  

InputStreams返回可以计算的字节数的估计值   从此输入流中读取(或跳过)而不会被阻止   下一次调用此输入流的方法。

此初始最大值也是您有时会看到对话框的原因。达到进度条的最大值后,对话框将自动关闭。 为了显示有用的内容,您必须以available()ProgressMonitor的形式向setMinimum提供有关起始位置和结束位置的一些提示。

setMaximum