Java获取下载进度

标签 java multithreading swing jframe

我正在编写一个 Java 应用程序(使用 NetBeans 作为 IDE 和 jFrame 形式),其中一部分下载文件。如何使用当前下载进度更新进度条,或者至少获取另一个线程中当前下载的字节总数?

下面是我的部分代码:

Runnable updatethread = new Runnable() {
        public void run() {
            try {
                java.io.BufferedInputStream in = new java.io.BufferedInputStream(new java.net.URL("server/package.zip").openStream());
                java.io.FileOutputStream fos = new java.io.FileOutputStream("package.zip");
                java.io.BufferedOutputStream bout = new BufferedOutputStream(fos,1024);
                byte[] data = new byte[1024];
                int x=0;
                while((x=in.read(data,0,1024))>=0)
                {
                    bout.write(data,0,x);
                }
                bout.close();
                in.close();
            }
            catch(FileNotFoundException e) { } catch (IOException e) { }
        }
    };
new Thread(updatethread).

start();
try {
    updatethread.wait();

} catch (InterruptedException ex) { }

最佳答案

一个工作示例,使用您的代码并在进度条中显示进度可能如下所示:

import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class Progressbar {

    public static void main(String[] args) {

        final JProgressBar jProgressBar = new JProgressBar();
        jProgressBar.setMaximum(100000);
        JFrame frame = new JFrame();
        frame.setContentPane(jProgressBar);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(300, 70);
        frame.setVisible(true);

        Runnable updatethread = new Runnable() {
            public void run() {
                try {

                    URL url = new URL("http://downloads.sourceforge.net/project/bitcoin/Bitcoin/blockchain/bitcoin_blockchain_170000.zip");
                    HttpURLConnection httpConnection = (HttpURLConnection) (url.openConnection());
                    long completeFileSize = httpConnection.getContentLength();

                    java.io.BufferedInputStream in = new java.io.BufferedInputStream(httpConnection.getInputStream());
                    java.io.FileOutputStream fos = new java.io.FileOutputStream(
                            "package.zip");
                    java.io.BufferedOutputStream bout = new BufferedOutputStream(
                            fos, 1024);
                    byte[] data = new byte[1024];
                    long downloadedFileSize = 0;
                    int x = 0;
                    while ((x = in.read(data, 0, 1024)) >= 0) {
                        downloadedFileSize += x;

                        // calculate progress
                        final int currentProgress = (int) ((((double)downloadedFileSize) / ((double)completeFileSize)) * 100000d);

                        // update progress bar
                        SwingUtilities.invokeLater(new Runnable() {

                            @Override
                            public void run() {
                                jProgressBar.setValue(currentProgress);
                            }
                        });

                        bout.write(data, 0, x);
                    }
                    bout.close();
                    in.close();
                } catch (FileNotFoundException e) {
                } catch (IOException e) {
                }
            }
        };
        new Thread(updatethread).

        start();
    }

}

这展示了如何去做——在使用它之前你应该考虑 GUI-Threads 等。

关于Java获取下载进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22273045/

相关文章:

java - 如何显示在文本中出现四次或多次的所有唯一单词的列表?

java - 需要有关哈希表的帮助

java - 具有单线程的计划执行程序服务

Java Swing MVC 动态组件

Java:Do-While 循环中的 Try-Catch 语句

python - 处理两个传入数据流并将它们组合在 python 中?

java - 在 Java 中并行执行依赖任务

java - 类中的空指针异常(代码看起来不错)Java

Java 保持框架聚焦

java - Spring 注入(inject): @Component over native singleton