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