我尝试使用 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秒。
答案 0 :(得分:4)
通用InputStream
不提供有关当前位置或外部世界总长度的信息。见InputStream
availiable()
不是InputStream
的总大小,也没有获取当前位置或获得总大小等内容。您也可能只读取流的块/部分,甚至进度条也能够计算出流的总长度,它不会知道您只会读取例如512字节。
ProcessMonitorInputStream
修饰提供的InputStream
并在读取操作期间更新对话框的进度条。默认情况下,ProgressMonitorInputStream
使用available
的{{1}}来初始化InputStream
的最大值。某些ProgressMonitor
的值可能正确,但在通过网络传输数据时尤其如此。
InputStreams
返回可以计算的字节数的估计值 从此输入流中读取(或跳过)而不会被阻止 下一次调用此输入流的方法。
此初始最大值也是您有时会看到对话框的原因。达到进度条的最大值后,对话框将自动关闭。
为了显示有用的内容,您必须以available()
和ProgressMonitor
的形式向setMinimum
提供有关起始位置和结束位置的一些提示。
setMaximum