0

我在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 语句的输出(最后几行)

Bytes downloaded: 371525502 out of 2821490
Bytes downloaded: 371525526 out of 2821490
Bytes downloaded: 371525631 out of 2821490
Bytes downloaded: 371525788 out of 2821490
Bytes downloaded: 371526028 out of 2821490
Bytes downloaded: 371526222 out of 2821490
Bytes downloaded: 371526442 out of 2821490
Bytes下载:371526697 出 2821490
字节下载:371526914 出 2821490

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

有任何想法吗?

4

2 回答 2

2

只需插入一个javax.swing.ProgressMonitorInputStream

于 2013-02-09T09:27:36.877 回答
2

我解决了,在i = in.read() 执行后,i变量将数据的字节表示保存到文件中,以此类推,每次循环迭代。所以它不是读取的字节数,它是一个字节的实际数据。

我将我的更改bytesDownloaded += i;bytesDownloaded++;,这在调试输出和进度条中都给了我正确的结果。

于 2013-02-09T02:41:24.297 回答