2

我正在尝试使用commons.io Apache library从 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 秒。

4

1 回答 1

4

泛型InputStream不提供有关当前位置或外部总长度的信息。请参阅InputStream availiable()不是总大小,InputStream并且没有获取当前位置或获取总大小之类的东西。您也可能只读取流的块/部分,即使进度条也能够计算出流的总长度,它不会知道您只会读取例如 512 个字节。

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

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

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

     // 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"));
     }
于 2016-07-28T16:24:42.000 回答