我正在编写一个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) { }
答案 0 :(得分:10)
一个工作示例,使用您的代码并在进度条中显示进度可能如下所示:
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等。
答案 1 :(得分:3)
我在上传进度条方面遇到了类似的问题,但解决方案基本相同;创建一个扩展CountingOutputStream
的新FileOutputStream
并使用一个可以在写入时监听字节的监听器。您可以在下面的链接中看到OutputStreamProgress类作为示例。
How to get a progress bar for a file upload with Apache HttpClient 4?
看起来Apache commons IO已经有一个类似于类的东西。这不完全是一回事。您必须轮询OutputStream以找出它所在的位置,在我提供给侦听器的解决方案中,回调将不断更新。
您可以通过maven获取它,或通过他们的网站下载jar。
Maven - > http://mvnrepository.com/artifact/commons-io/commons-io
Jar - > http://commons.apache.org/proper/commons-io/download_io.cgi
答案 2 :(得分:2)
URL url = new URL(urlString);
HttpURLConnection httpConnection = (HttpURLConnection) (url.openConnection());
long fileSize = httpConnection.getContentLength();
请注意content-length
由Http Header
中的服务器提供。
函数getContentLength()
的API:
int java.net.URLConnection.getContentLength()
返回content-length头字段的值。
<强>返回:强>
此连接的URL的资源的内容长度 引用,如果内容长度未知,则返回-1。