[英]Java BufferedInputStream Progress Bar
我在获取JProgressBar
来显示HTTP下载状态时遇到了一个小问题。
进度条正在工作,但是填充速度过快,最终超过了最大值,如下所示:
public void test(InputStream stream, File location) {
BufferedInputStream in = new BufferedInputStream(stream);
FileOutputStream file = new FileOutputStream(location);
BufferedOutputStream out = new BufferedOutputStream(file);
int i;
int bytesDownloaded = 0;
while ((i = in.read()) != -1) {
bytesDownloaded += i;
out.write(i);
System.out.println("Bytes downloaded: " + bytesDownloaded + " out of " + len);
update(bytesDownloaded);
}
}
问题是, bytesDownloaded
最终比文件末尾的len大得多,是in.read()
实际上返回文件中的最新字节或其他值吗? 我假设前者来自Java 7 API,但是它与我的发现不符。
我正在2.69MB的文件上测试此代码段。
这是println语句的输出(最后几行)
下载的字节数:2821490中的371525502
下载的字节数:2821490中的371525526
下载的字节数:2821490之371525631
下载的字节数:2821490中的371525788
已下载的字节数:2821490(371526028)
下载的字节数:2821490中的371526222
下载的字节数:371526442(共2821490)
下载的字节数:2821490中的371526697
下载的字节数:371526914(共2821490)
现在我知道2821490
是2821490
的正确字节值,所以我的问题仍然存在,为什么BufferedInputStream的read()
函数将文件读取字节的末尾显示为371526914
,如果这确实是字节,那么大约等于350MB该文件显然不是!
有任何想法吗?
在i = in.read()
执行后, i = in.read()
出i
变量将数据的字节表示形式保存到文件中的一个字节,依此类推,每次循环迭代。 因此,它不是读取的字节数,而是一个字节的实际数据。
我改变了我的bytesDownloaded += i;
到bytesDownloaded++;
这在调试输出以及进度栏中都给了我正确的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.