使用java实现在下载文件的过程中显示进度条

relaxpeople 2014-10-30 01:16:19
各位牛人:
· 最近需要实现一个进度条,在单击下载按钮后,开始下载,并显示进度条,进度条我是另起了个Thread,代码是
ProgressBarThread progressBarThread = new ProgressBarThread(progressBar);
progressBarThread.start();
后面是使用HttpClient现在文件
ProgressBarThread.java用于自动将进度条的值进行递增,里面的代码我参考了网上用的代码,使用display的异步去递增进度条,然后在监听按钮的download.java中去下载文件,得到的结果是进度条显示但不递增,文件下载成功就隐藏了,在网上查了很多都没法解决,我是实在没办法了,求高手帮忙!
...全文
15465 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
疯狂熊猫人 2014-11-03
  • 打赏
  • 举报
回复
HttpClient client = new DefaultHttpClient();
		HttpResponse resp = client.execute(new HttpPost(""));
		HttpEntity entity = resp.getEntity();
		int length = (int)entity.getContentLength();//这个就是下载的文件(不单指文件)大小
		InputStream is = entity.getContent();
		ProgressBarThread pbt = new ProgressBarThread(length);//创建进度条
        new Thread(pbt).start();//开启线程,刷新进度条
		byte[] buf = new byte[1024];
		int size = 0;
		FileOutputStream fos = new FileOutputStream(new File(""));
		while((size=is.read(buf))!=-1){
			fos.write(buf,0,size);
			pbt.updateProgress(size);//写完一次,更新进度条
		}
		pbt.finish();//文件读取完成,关闭进度条
        fos.flush();
        fos.close();
		resp.abort();
疯狂熊猫人 2014-11-03
  • 打赏
  • 举报
回复
引用 3 楼 relaxpeople 的回复:
感谢两位的回答,我是用Eclipse开发插件,监听插件对话框上的“下载”按钮,如果按了,就利用HttpClient这个类去下载一个IP地址里的文件,那个进度条用于显示下载进度,由于不需要十分准确的,所以我起了个单独的线程控制进度条,也没有传递获取文件大小及已下载大小的接口,现在的问题是我在下载时只有releaseconnection后进度条才开始更新,之前都是0,这个应该怎么解决呢?
为什么就获取不到文件大小呢?通过HttpEntity的getContentLength()不就可以去到大小了吗? 另外,如果你不知道文件大小,你怎么实现进度条?你怎么计算当前文件下载的百分比?如果做一个虚假的进度条,那你也完全没有必要搞这么复杂。
relaxpeople 2014-10-30
  • 打赏
  • 举报
回复
感谢两位的回答,我是用Eclipse开发插件,监听插件对话框上的“下载”按钮,如果按了,就利用HttpClient这个类去下载一个IP地址里的文件,那个进度条用于显示下载进度,由于不需要十分准确的,所以我起了个单独的线程控制进度条,也没有传递获取文件大小及已下载大小的接口,现在的问题是我在下载时只有releaseconnection后进度条才开始更新,之前都是0,这个应该怎么解决呢?
疯狂熊猫人 2014-10-30
  • 打赏
  • 举报
回复
我把我的想法写成一个简单的例子吧:
package test;

import java.util.ArrayList;

public class ProgressBarThread implements Runnable{

	private ArrayList<Integer> proList = new ArrayList<Integer>();
	private int progress;//当前进度
	private int totalSize;//总大小
	private boolean run = true;
	
	public ProgressBarThread(int totalSize){
		this.totalSize = totalSize;
		//TODO 创建进度条
	}
	
	/**
	 * @param progress 进度
	 */
	public void updateProgress(int progress){
		synchronized (this.proList) {
			if(this.run){
				this.proList.add(progress);
				this.proList.notify();
			}
		}
	}
	
	public void finish(){
		this.run = false;
		//关闭进度条
	}
	
	@Override
	public void run() {
		synchronized (this.proList) {
			try {
				while (this.run) {
					if(this.proList.size()==0){
						this.proList.wait();
					}
					synchronized (proList) {
						this.progress += this.proList.remove(0);
						//TODO 更新进度条
						System.err.println("当前进度:"+(this.progress/this.totalSize*100)+"%");
						
					}
				}
				System.err.println("下载完成");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
public static void main(String[] args) {
		try {
			File file = new File("源文件");
			FileInputStream fis = new FileInputStream(file);
			FileOutputStream fos = new FileOutputStream("文件保存路径");
			ProgressBarThread pbt = new ProgressBarThread((int)file.length());//创建进度条
			new Thread(pbt).start();//开启线程,刷新进度条
			byte[] buf = new byte[1024];
			int size = 0;
			while((size = fis.read(buf))>-1){//循环读取
				fos.write(buf, 0, size);
				pbt.updateProgress(size);//写完一次,更新进度条
			}
			pbt.finish();//文件读取完成,关闭进度条
			fos.flush();
			fos.close();
			fis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
快乐的2 2014-10-30
  • 打赏
  • 举报
回复
Android还是J2SE? Android的控件更新是需要放到主线程里做的。 J2SE的倒是没注意,但看你的ProgressBarThread这个类并没有传递获取文件大小及已下载大小的接口。

58,454

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧