繁体   English   中英

Java BufferedInputStream进度栏

[英]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)

现在我知道28214902821490的正确字节值,所以我的问题仍然存在,为什么BufferedInputStream的read()函数将文件读取字节的末尾显示为371526914 ,如果这确实是字节,那么大约等于350MB该文件显然不是!

有任何想法吗?

i = in.read()执行后, i = in.read()i变量将数据的字节表示形式保存到文件中的一个字节,依此类推,每次循环迭代。 因此,它不是读取的字节数,而是一个字节的实际数据。

我改变了我的bytesDownloaded += i; bytesDownloaded++; 这在调试输出以及进度栏中都给了我正确的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM