天天看点

swing 下载文件时的进度条

swing 下载文件时的进度条

 下载完成之后:

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

核心代码:

swing 下载文件时的进度条

/*** 

     * 在实际使用过程中,应该放在线程中 

     * @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);  

 使用进度条的代码:

swing 下载文件时的进度条

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 构建