gpt4 book ai didi

java - 使用 FileUtils 下载时的进度条

转载 作者:行者123 更新时间:2023-11-30 06:53:52 25 4
gpt4 key购买 nike

我正在尝试使用 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 秒。

最佳答案

通用 InputStream 不提供有关当前位置或外部世界总长度的信息。参见 InputStreamavailiable() 不是 InputStream 的总大小,并且没有像获取当前位置或获取总大小这样的东西。您也可能只读取流的 block /部分,即使进度条能够计算出流的总长度,它也不知道您将只读取例如 512 字节。

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

available() returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking by the next invocation of a method for this input stream.

这个初始最大值也是您有时会看到对话框的原因。达到进度条的最大值后,对话框自动关闭。为了显示任何有用的东西,您必须以 setMinimumsetMaximum 的形式给 ProgressMonitor一些关于开始位置和结束位置的提示。

     // using a File just for demonstration / testing
File f = new File("a");
try (InputStream stream = new FileInputStream(f)) {
ProgressMonitorInputStream pmis = new ProgressMonitorInputStream(null, "Downloading...", stream);
int downloadSize = f.length();
ProgressMonitor pm = pmis.getProgressMonitor();
pm.setMillisToDecideToPopup(0);
pm.setMillisToPopup(0);
// tell the progress bar that we start at the beginning of the stream
pm.setMinimum(0);
// tell the progress bar the total number of bytes we are going to read.
pm.setMaximum(downloadSize);
copyInputStreamToFile(pmis, new File("/tmp/b"));
}

关于java - 使用 FileUtils 下载时的进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36980851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com