Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java getting download progress

I am writing a Java application (Using NetBeans as an IDE and a jFrame form), and one part of it downloads a file. How can I update a progress bar with the current progress of the download, or at least get the total amount of currently downloaded bytes in another thread?

Below is a part of my code:

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) { }
like image 604
deejay31 Avatar asked Mar 08 '14 18:03

deejay31


People also ask

How can I check Windows download progress?

By default, if Windows Store is downloading an application, the download progress should show at the right-side of the app. It should show a blue progress bar and the progress of the file size download.

How does progress bar work in Java?

JProgressBar visually displays the progress of some specified task. JProgressBar shows the percentage of completion of specified task. The progress bar fills up as the task reaches it completion. In addition to show the percentage of completion of task, it can also display some text .


3 Answers

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.

like image 143
slartidan Avatar answered Oct 30 '22 07:10

slartidan


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

like image 30
Jazzepi Avatar answered Oct 30 '22 06:10

Jazzepi


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.

like image 2
Jiang Avatar answered Oct 30 '22 06:10

Jiang