Java获得下载进度

我正在编写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等。

我在上传进度条时遇到了类似的问题,但解决方案基本相同; 创建一个新的CountingOutputStream ,它扩展FileOutputStream并获取一个可以在写入时监听字节的监听器。 您可以在下面的链接中看到OutputStreamProgress类作为示例。

如何使用Apache HttpClient 4获取文件上载的进度条?

看起来像Apache commons IO已经有一个类似于类的东西。 这不完全是一回事。 您必须轮询OutputStream以找出它所处的位置,在我提供给侦听器的解决方案中,回调将不断更新。

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

您可以通过maven获取它,或通过他们的网站下载jar。

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

请注意, content-lengthHttp Header的服务器提供。

函数getContentLength() API:

  • int java.net.URLConnection.getContentLength()

    返回content-length头字段的值。

    返回:

    此连接的URL引用的资源的内容长度,如果内容长度未知,则为-1。