
下载完成之后:
难点在于:在读取输入流的时候,实时更新进度条。
我自己定了一个规则:
(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);
核心代码:
/***
* 在实际使用过程中,应该放在线程中
* @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;
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) {
target.close();
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 构建