我正在编写
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,1024))>=0) { bout.write(data,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,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,x); } bout.close(); in.close(); } catch (FileNotFoundException e) { } catch (IOException e) { } } }; new Thread(updatethread). start(); } }
这显示了如何做到 – 在使用之前你应该考虑GUI-Threads等.