`

swing 下载文件时的进度条

阅读更多

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

 下载完成之后:

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

我自己定了一个规则:

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

    (2)获取文件的大小,并平分为100等份,得到1

     (3拿每一等份(1)和1024比较:若小于等于1024,则字节数组大小为1

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

      

 

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

核心代码:

/***
	 * 在实际使用过程中,应该放在线程中
	 * @param in
	 * @param sourceSize
	 *            : 输入流的长度,即要读取的字节个数
	 * @param targfile
	 */
	public static void progress(JProgressBar copyProgressBar, InputStream in,
			long sourceSize, File targfile) {
		FileOutputStream target = null;
		try {
			int bytesArrLeng = 0;
			if (sourceSize < SystemHWUtil.BUFF_SIZE_1024) {//
				bytesArrLeng = (int) sourceSize;
			} else {
				long shangOne = sourceSize / SystemHWUtil.NUMBER_100;
				if (shangOne == 0) {// sourceSize<100
					shangOne = shangOne + 1;
				}

				if (shangOne <= SystemHWUtil.BUFF_SIZE_1024) {
					bytesArrLeng = (int) shangOne;
				} else {
					long shangTwo = shangOne / SystemHWUtil.BUFF_SIZE_1024;
					if (shangOne % SystemHWUtil.BUFF_SIZE_1024 != 0) {
						shangTwo = shangTwo + 1L;
					}
					bytesArrLeng = (int) (shangOne / shangTwo);
				}
			}
			System.out.println("字节数组的长度是:" + bytesArrLeng);
			target = new FileOutputStream(targfile);
			byte[] buffer = new byte[bytesArrLeng];
			int byteNum;
			long hasReadByte = 0L;// 已经读取的字节个数
			float result;
			int progressSize = 0;
			while ((byteNum = in.read(buffer)) != SystemHWUtil.NEGATIVE_ONE) {
				target.write(buffer, 0, byteNum);
				hasReadByte = hasReadByte + byteNum;
				result = (float) ((double) hasReadByte / sourceSize);
				progressSize = Math.round(result * SystemHWUtil.NUMBER_100);
				// copyProgressBar.setString(progressSize + "%");
				// copyProgressBar.setValue(progressSize);
				updateProgress(copyProgressBar, progressSize);
			}
			if (progressSize < SystemHWUtil.NUMBER_100) {
				progressSize = SystemHWUtil.NUMBER_100;
				updateProgress(copyProgressBar, progressSize);
			}
			copyProgressBar.setForeground(Color.blue);
			// System.out
			// .println("[SystemUtil:copyFile]:file copy successfully!");
			// resultTextArea.setText();

		} catch (Exception e) {
			e.printStackTrace();
			// copyFileBtn.setEnabled(true);
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				in = null;
			}
			if (target != null) {
				try {
					target.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				target = null;
			}
		}
	}

	/***
	 * 更新进度条上得进度数字
	 * @param copyProgressBar
	 * @param progressSize
	 */
	private static void updateProgress(JProgressBar copyProgressBar, int progressSize) {
		copyProgressBar.setString(progressSize + "%");
		copyProgressBar.setValue(progressSize);
	}

 使用进度条的代码:

new Thread(new Runnable() {

					@Override
					public void run() {
						try {
							HttpSocketUtil.setDetail(true);
							// HttpSocketUtil.httpRequest(urlTF.getText(), null,
							// null, true, selectedFile, -1, -1);
							HttpURLConnection huc = HttpSocketUtil
									.beforeConnect(httpSenderApp.getUrlTF()
											.getText(), null, null, null, null,
											SystemHWUtil.NEGATIVE_ONE,
											SystemHWUtil.NEGATIVE_ONE);
							InputStream in = huc.getInputStream();
							int contentLength;
							String sizeHeadKey = null;
							if (ValueWidget.isNullOrEmpty(sizeHeadKey)) {// 若header中没有size
								contentLength = huc.getContentLength();
							} else {
								contentLength = Integer.parseInt(huc
										.getHeaderField(sizeHeadKey));
							}
							ComponentUtil.progress(
									httpSenderApp.getCopyProgressBar(), in,
									contentLength, selectedFile);

							GUIUtil23.infoDialog("下载成功!size:"
									+ FileUtils.formatFileSize2(selectedFile
											.length()));
						} catch (Exception e) {
							GUIUtil23.errorDialog(e.getMessage());
							e.printStackTrace();
						}

					}
				}).start();

 

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

demo:http-sender

注意:项目使用maven 构建

参考:

http://hw1287789687.iteye.com/blog/2246665

 

  • 大小: 35.3 KB
  • 大小: 41.1 KB
1
0
分享到:
评论

相关推荐

    java swing拷贝文件进度条

    在Java Swing中实现文件拷贝并同时显示进度条是一项常见的任务,特别是在处理大文件时,让用户了解拷贝进度是提高用户体验的重要方式。下面我们将深入探讨如何使用Java Swing来创建这样一个功能。 首先,我们需要...

    批量上传文件带进度条

    在处理文件上传时,Java的`java.io`和`java.nio`包提供了读取和写入文件的基本功能。对于批量操作,可以使用`java.util.ArrayList`或`java.util.List`来存储待上传文件的路径信息。 多线程技术是实现文件上传进度条...

    根据文件大小显示文件复制进度条

    例如,在Java中,我们可以使用`java.nio`包进行文件操作和`Swing`或`JavaFX`创建GUI进度条;在Python中,`os`和`shutil`模块可用于文件操作,而`tkinter`或`PyQt`可以用来创建进度条界面。 总之,"根据文件大小显示...

    SWING进度条

    它常用于长时间运行的任务,如文件下载、数据处理或网络通信,为用户提供反馈,让他们知道程序仍在运行并且可以预期完成的时间。Swing组件是Java Foundation Classes (JFC)的一部分,提供了一套丰富的图形用户界面...

    swing不确定进度条

    在GUI应用程序中,当执行耗时操作如文件读写、网络通信或大数据处理时,为了提高用户体验,通常会使用进度条(JProgressBar)来显示任务的进度。在某些情况下,我们无法预估任务的具体完成时间,这时我们可以使用...

    复制文件并带有进度条

    在IT领域,尤其是在软件开发中,"复制文件并带有进度条"是一个常见的需求,尤其是在大量数据传输或长时间操作时,进度条能提供用户友好的体验,让用户了解操作的状态和预计剩余时间。本教程将深入探讨如何实现这个...

    JAVA文件下载(限速、进度条)

    http://blog.csdn.net/r3lish/article/details/51912543 进度条:78%[===================&gt; ]97.7K/s, will be finished in 75.59s 限速、文件网络地址、文件本地路径,均可在代码里修改。

    swing进度条demo

    这个“swingprogress”压缩包文件可能包含一个或多个示例代码,用于演示如何在实际项目中集成和使用Swing的进度条功能。通过阅读和学习这些代码,开发者能够更好地理解如何在Java GUI应用程序中有效地使用...

    Java Swing 进度条

    在实际开发中,这些类和示例可以帮助我们创建更友好的用户界面,特别是在执行耗时操作时,如文件上传、下载或大数据处理。通过自定义`ProgressBarUI`,我们可以使应用程序的界面更加个性化和专业。而使用`...

    多线程保存文件、显示进度条、对话框大小可变 进度条

    在IT领域,尤其是在桌面应用程序和GUI(图形用户界面)开发中,"多线程保存文件、显示进度条、对话框大小可变"是常见的需求,它们涉及到程序性能优化、用户体验提升以及界面交互设计等多个关键点。下面将详细阐述...

    FTPUpload上传文件 进度条显示进度

    下面将详细讲解如何使用Java的Swing库创建一个带有进度条的FTP文件上传功能。 首先,我们需要理解FTP的基本原理。FTP是一种用于在Internet上进行文件传输的标准协议。Java提供了一个内置的`java.net.FTPClient`类,...

    java文件上传进度条实现

    当上传进度发生变化时,更新UI界面上的进度条。这个过程通常分为以下几个步骤: 1. **创建上传任务**:创建一个表示文件上传的任务,包含文件路径、目标URL等信息。 2. **计算文件大小**:在上传前获取文件的总...

    javaftpclient.zip_Java FTP上传_swing 上传_swing上传下载_swing文件上传

    而在下载时,可能使用`retrieveFile()`方法将服务器上的文件下载到本地。 此外,为了实现文件的滚动上传,可能使用了`JProgressBar`组件来显示上传进度。这通常涉及到监听文件传输过程,更新进度条的值,以便用户...

    JAVA 带进度条的文件拷贝程序

    综上所述,这个“JAVA 带进度条的文件拷贝程序”涉及到Java GUI编程的核心概念,包括Swing组件的使用、文件操作、多线程、事件监听以及异常处理。对于初学者而言,这是一个很好的实践项目,可以帮助他们更好地理解和...

    Java实现显示进度条

    本示例主要使用了Swing库中的组件,Swing是Java中的一个用于创建图形用户界面的工具包,提供了丰富的UI组件,包括`JProgressBar`(进度条)。 #### 关键代码解析 下面我们将对这段代码进行逐行分析: 1. **导入...

    java Swing 文件批量上传 DEMO 源代码

    在这个"java Swing 文件批量上传 DEMO 源代码"中,我们关注的核心是利用Swing构建一个用户界面,实现文件和文件夹的批量上传功能。这涉及到多个Java Swing组件、事件处理以及文件I/O操作。 首先,Swing 提供了诸如...

    下载模块(带进度条).zip

    当涉及到“下载带进度条”的功能时,我们关注的是用户界面(UI)与后台数据传输过程的交互,为用户提供可视化的下载进度反馈。这不仅提高了用户体验,也使用户能够更好地管理他们的下载任务。 首先,我们要理解下载...

Global site tag (gtag.js) - Google Analytics