Java getting download progress

你。 提交于 2019-11-29 10:36:56

A working example, using your code and displaying the progress in a progress bar could look like this:

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();
    }

}

This shows how to do it - before using it you should think about GUI-Threads, etc.

Jazzepi

I had a similar problem with doing a progress bar for uploads, but the solution is basically the same; create a new CountingOutputStream that extends FileOutputStream and takes a listener that can listen to the bytes as they're written. You can see the OutputStreamProgress class as an example in the link below.

How to get a progress bar for a file upload with Apache HttpClient 4?

It looks like Apache commons IO already has a class that does something similar. This isn't exactly the same thing. You have to poll the OutputStream to find out where it's at, where-as in the solution I provided with the listener, the callbacks are being updated continuously.

http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/output/CountingOutputStream.html

You can get it through maven, or downloading the jar through their website.

Maven -> http://mvnrepository.com/artifact/commons-io/commons-io

Jar -> http://commons.apache.org/proper/commons-io/download_io.cgi

URL url = new URL(urlString);
HttpURLConnection httpConnection = (HttpURLConnection) (url.openConnection());
long fileSize = httpConnection.getContentLength();

Notice that the content-length is provided by the server in Http Header.

API for the function getContentLength() :

  • int java.net.URLConnection.getContentLength()

    Returns the value of the content-length header field.

    Returns:

    the content length of the resource that this connection's URL references, or -1 if the content length is not known.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!