swing 下载文件时的进度条

Java swing中经常要使用到进度条,比如下载文件和拷贝文件时显示进度,如下图所示:

 下载完成之后:

难点在于:在读取输入流的时候,实时更新进度条。 

我自己定了一个规则:

(1) 若输入流的大小小于1024,则字节数组的长度就是输入流的大小。

<!--[if !supportLists]-->(1)      (2) <!--[endif]-->获取文件的大小,并平分为100等份,得到1

<!--[if !supportLists]-->(2)       (3)<!--[endif]-->拿每一等份(1)和1024比较:若小于等于1024,则字节数组大小为1

若大于1024,则除以1024,得到2,则字节数组大小为商1/商2

<!--[if !supportLists]-->(3)      

 

规定:100%时的颜色为蓝色:copyProgressBar.setForeground(Color.blue);

核心代码:

Java代码  

  1. /*** 
  2.      * 在实际使用过程中,应该放在线程中 
  3.      * @param in 
  4.      * @param sourceSize 
  5.      *            : 输入流的长度,即要读取的字节个数 
  6.      * @param targfile 
  7.      */  
  8.     public static void progress(JProgressBar copyProgressBar, InputStream in,  
  9.             long sourceSize, File targfile) {  
  10.         FileOutputStream target = null;  
  11.         try {  
  12.             int bytesArrLeng = 0;  
  13.             if (sourceSize < SystemHWUtil.BUFF_SIZE_1024) {//  
  14.                 bytesArrLeng = (int) sourceSize;  
  15.             } else {  
  16.                 long shangOne = sourceSize / SystemHWUtil.NUMBER_100;  
  17.                 if (shangOne == 0) {// sourceSize<100  
  18.                     shangOne = shangOne + 1;  
  19.                 }  
  20.   
  21.                 if (shangOne <= SystemHWUtil.BUFF_SIZE_1024) {  
  22.                     bytesArrLeng = (int) shangOne;  
  23.                 } else {  
  24.                     long shangTwo = shangOne / SystemHWUtil.BUFF_SIZE_1024;  
  25.                     if (shangOne % SystemHWUtil.BUFF_SIZE_1024 != 0) {  
  26.                         shangTwo = shangTwo + 1L;  
  27.                     }  
  28.                     bytesArrLeng = (int) (shangOne / shangTwo);  
  29.                 }  
  30.             }  
  31.             System.out.println("字节数组的长度是:" + bytesArrLeng);  
  32.             target = new FileOutputStream(targfile);  
  33.             byte[] buffer = new byte[bytesArrLeng];  
  34.             int byteNum;  
  35.             long hasReadByte = 0L;// 已经读取的字节个数  
  36.             float result;  
  37.             int progressSize = 0;  
  38.             while ((byteNum = in.read(buffer)) != SystemHWUtil.NEGATIVE_ONE) {  
  39.                 target.write(buffer, 0, byteNum);  
  40.                 hasReadByte = hasReadByte + byteNum;  
  41.                 result = (float) ((double) hasReadByte / sourceSize);  
  42.                 progressSize = Math.round(result * SystemHWUtil.NUMBER_100);  
  43.                 // copyProgressBar.setString(progressSize + "%");  
  44.                 // copyProgressBar.setValue(progressSize);  
  45.                 updateProgress(copyProgressBar, progressSize);  
  46.             }  
  47.             if (progressSize < SystemHWUtil.NUMBER_100) {  
  48.                 progressSize = SystemHWUtil.NUMBER_100;  
  49.                 updateProgress(copyProgressBar, progressSize);  
  50.             }  
  51.             copyProgressBar.setForeground(Color.blue);  
  52.             // System.out  
  53.             // .println("[SystemUtil:copyFile]:file copy successfully!");  
  54.             // resultTextArea.setText();  
  55.   
  56.         } catch (Exception e) {  
  57.             e.printStackTrace();  
  58.             // copyFileBtn.setEnabled(true);  
  59.         } finally {  
  60.             if (in != null) {  
  61.                 try {  
  62.                     in.close();  
  63.                 } catch (IOException e) {  
  64.                     e.printStackTrace();  
  65.                 }  
  66.                 in = null;  
  67.             }  
  68.             if (target != null) {  
  69.                 try {  
  70.                     target.close();  
  71.                 } catch (IOException e) {  
  72.                     e.printStackTrace();  
  73.                 }  
  74.                 target = null;  
  75.             }  
  76.         }  
  77.     }  
  78.   
  79.     /*** 
  80.      * 更新进度条上得进度数字 
  81.      * @param copyProgressBar 
  82.      * @param progressSize 
  83.      */  
  84.     private static void updateProgress(JProgressBar copyProgressBar, int progressSize) {  
  85.         copyProgressBar.setString(progressSize + "%");  
  86.         copyProgressBar.setValue(progressSize);  
  87.     }  

 使用进度条的代码:

Java代码  

  1. new Thread(new Runnable() {  
  2.   
  3.                     @Override  
  4.                     public void run() {  
  5.                         try {  
  6.                             HttpSocketUtil.setDetail(true);  
  7.                             // HttpSocketUtil.httpRequest(urlTF.getText(), null,  
  8.                             // null, true, selectedFile, -1, -1);  
  9.                             HttpURLConnection huc = HttpSocketUtil  
  10.                                     .beforeConnect(httpSenderApp.getUrlTF()  
  11.                                             .getText(), null, null, null, null,  
  12.                                             SystemHWUtil.NEGATIVE_ONE,  
  13.                                             SystemHWUtil.NEGATIVE_ONE);  
  14.                             InputStream in = huc.getInputStream();  
  15.                             int contentLength;  
  16.                             String sizeHeadKey = null;  
  17.                             if (ValueWidget.isNullOrEmpty(sizeHeadKey)) {// 若header中没有size  
  18.                                 contentLength = huc.getContentLength();  
  19.                             } else {  
  20.                                 contentLength = Integer.parseInt(huc  
  21.                                         .getHeaderField(sizeHeadKey));  
  22.                             }  
  23.                             ComponentUtil.progress(  
  24.                                     httpSenderApp.getCopyProgressBar(), in,  
  25.                                     contentLength, selectedFile);  
  26.   
  27.                             GUIUtil23.infoDialog("下载成功!size:"  
  28.                                     + FileUtils.formatFileSize2(selectedFile  
  29.                                             .length()));  
  30.                         } catch (Exception e) {  
  31.                             GUIUtil23.errorDialog(e.getMessage());  
  32.                             e.printStackTrace();  
  33.                         }  
  34.   
  35.                     }  
  36.                 }).start();  

 

依赖的jar:io0007-find_progess-0.0.7.2-SNAPSHOT.jar

demo:http-sender

注意:项目使用maven 构建

时间: 2024-08-06 21:48:29

swing 下载文件时的进度条的相关文章

java实现在复制文件时使用进度条(java实现进度条)_java

思路分析: 因为既要有操作面板又要有进度条,所以肯定要出现两个继承JFrame类的窗体.先看被调用的进度条窗体,它不需要手动操作,所以类的内部实现一个方法就可以了.因为设计文件操作,所以要捕获异常.首先根据要复制的文件创建File对象,以及根据复制后文件的保存地址创建File对象,然后创建FileOutputStream对象,再创建FileInputStream对象,之后是ProgressMonitorInputStream对象,然后读取文件,如果总耗时超过2秒,将会自动弹出一个进度监视窗口.接

progressbar-ashx+easyui如何实现上传文件时的进度条

问题描述 ashx+easyui如何实现上传文件时的进度条 我前端用的easyui的filebox,才用form提交方式,后台是ashx,以流方式读取文件并以二进制形式保存在数组实现了文件上传功能,但我现在还需要进度条,请问我该用什么方法实现进度条,谢谢. 解决方案 Servlet实现上传文件进度条JAVA实现显示上传文件进度条PHP 大文件上传进度条实现 解决方案二: 见百度.要积分.见百度.要积分.对不起 解决方案三: 利用xmlhttprequest对象 解决方案四: xmlhttpreq

Handler实现线程之间的通信下载文件动态更新进度条

1. 原理 每一个线程对应一个消息队列MessageQueue,实现线程之间的通信,可通过Handler对象将数据装进Message中,再将消息加入消息队列,而后线程会依次处理消息队列中的消息. 2. Message 初始化:一般使用Message.obtain()方法获取一个消息对象,该方法会检查Message对象池中是否存在可重复利用的对象,若无,才会new一个新对象. what:相当于Message的标识符,区别于其它消息. arg1.arg2:int类型,可传递整数. obj:objec

android中实现OkHttp下载文件并带进度条

OkHttp是比较火的网络框架,它支持同步与异步请求,支持缓存,可以拦截,更方便下载大文件与上传文件的操作.下面我们用OkHttp来下载文件并带进度条! 相关资料: 官网地址:http://square.github.io/okhttp/ github源码地址:https://github.com/square/okhttp 一.服务器端简单搭建 可以参考搭建本地Tomcat服务器及相关配置 这篇文章. 新建项目OkHttpServer,在WebContent目录下新建downloadfile目

下载文件并显示进度条

  UINT DownloadFile(LPVOID pParam){ CWnd*   pwnd = AfxGetMainWnd(); CProgressCtrl* m_Prog = (CProgressCtrl*)pwnd->GetDlgItem(IDC_PROGRESS1); CButton*  bStart = (CButton*)pwnd->GetDlgItem(IDB_BTN_START);  char    filebuf[512]; CInternetSession netSes

python下载文件时显示下载进度的方法_python

本文实例讲述了python下载文件时显示下载进度的方法.分享给大家供大家参考.具体分析如下: 将这段代码放入你的脚本中,类似:urllib.urlretrieve(getFile, saveFile, reporthook=report) 第三个参数如下面的函数定义report,urlretrieve下载文件时会实时回调report函数,显示下载进度 def report(count, blockSize, totalSize): percent = int(count*blockSize*10

PHP中使用Session配合Javascript实现文件上传进度条功能_php技巧

Web应用中常需要提供文件上传的功能.典型的场景包括用户头像上传.相册图片上传等.当需要上传的文件比较大的时候,提供一个显示上传进度的进度条就很有必要了. 在PHP 5.4以前,实现这样的进度条并不容易,主要有三种方法: 1.使用Flash, Java, ActiveX 2.使用PHP的APC扩展 3.使用HTML5的File API 第一种方法依赖第三方的浏览器插件,通用性不足,且易带来安全隐患.不过由于Flash的使用比较广泛,因此还是有很多网站使用Flash作为解决方案. 第二种方法的不足

Android使用AsyncTask下载图片并显示进度条功能

在Android中实现异步任务机制有两种方式,Handler和AsyncTask.这篇文章给大家介绍Android使用AsyncTask下载图片并显示进度条功能. AsyncTask下载图片并显示下载进度,异步类AsyncTask配合进度条,简练! public class AsyncTaskActivity2 extends Activity { private Button btnDown;//图片框 private ImageView ivImage;//图片URL private sta

php+ajax文件上传进度条

ajax|上传 代码分为以下部分: demo.php - 上传过程处理 PLAIN TEXTPHP: <?php include 'UploadProgressMeter.class.php'; $fileWidget = new UploadProgressMeter(); if ($fileWidget->uploadComplete()) {        // 上传完毕的时候,从iframe发送一个js到主窗口表示一切ok        echo $fileWidget->fin