package com.file; import java.io.*; import java.text.DecimalFormat; import java.util.ArrayList; // 使用java实现在下载文件的过程中显示进度条 public class TestFile { public static 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 更新进度条 DecimalFormat decimalFormat = new DecimalFormat( "0.00" ); System.err.println( "当前进度:" + decimalFormat.format( this.progress / (float) this.totalSize * 100 ) + "%" ); } } System.out.println( "下载完成" ); } catch (Exception e) { e.printStackTrace(); } } } } }
测试代码
// 测试 public static void main(String[] args) { try { File file = new File( "/Users/zhenning/Documents/tools/mysql51.docset.zip" ); FileInputStream fis = new FileInputStream( file ); FileOutputStream fos = new FileOutputStream( "/Users/zhenning/Desktop/mysql51.docset.zip" ); 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(); } }
//
// 测试 public static void main(String[] args) { HttpClient httpClient = new DefaultHttpClient(); try { HttpResponse resp = httpClient.execute( new HttpPost( "http://wppkg.baidupcs.com/issue/netdisk/MACguanjia/BaiduNetdisk_mac_3.4.1.dmg" ) ); 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( "/Users/zhenning/Desktop/BaiduNetdisk_mac_3.4.1.dmg" ) ); // while ((size = is.read( buf )) > -1) { //循环读取 fos.write( buf, 0, size ); pbt.updateProgress( size );//写完一次,更新进度条 } pbt.finish(); //文件读取完成,关闭进度条 fos.flush(); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }