泛型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"));
}