使用java ftpClinet进行多线程下载,并且打印下载进度,结果为什么会超过100%?

route000 发布于 2017/06/15 16:59
阅读 763
收藏 0

最近公司有一个项目,是一个将上平台的节目拷贝到本平台的模式,拷贝程序部署在本平台,通过ftpclient连接到上平台,获取远程文件,然后下载到本机服务器,下载过程中还要记录偏移量算出下载进度,并打印到日志,一般情况下1%到100%就是正常下载完了;下载还分两种,普通下载和断点续传,断点续传是将一个本地文件的大小传入ftpClient.setRestartOffset(long lo),这个ftp方法是类似封装了操作指针的seek方法,它会将远程文件从lo后的字节开始下载(移动了指针),比如远程文件100M,本地已经存在一个80M的同名文件,那就接着下后面的20M,下载进度打印是从80%到100%,下面断点续传下载代码(普通下载就不贴了,差不多)

BufferedInputStream in = null;
ftpClient.setRestartOffset(localFileSize);        //这个是断点续传的关键,设置远程文件偏移量
                            BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new String(obj.getUploadFilePath().getBytes("GBK"), "iso-8859-1"), true));
                            in = new BufferedInputStream(ftpClient.retrieveFileStream(new String(fname.getBytes("GBK"), "iso-8859-1")));
                            long step = remoteSize / 100;    //remoteSize远程文件
                            long process = 0;
                            long ls = localFileSize;    //本地同名文件,有一定大小
                            int c;
                            int x = 1;
                            ftpClient.setSoTimeout(30 * 1000);
                            if(in != null){
                                while ((c = in.read(bytes)) != -1) {
                                    out.write(bytes, 0, c);
                                    ls += c;
    
                                    long nowProcess = ls / step;
                                    if (nowProcess > process) {
                                        process = nowProcess;
                                        if (process % 1 == 0) {
                                            logger.info(Thread.currentThread().getName() + "Download progress:" + process);
                                        }
                                    }
                                    x++;
                                }
                            }else{
                                out.close();
                                logger.info("inputStream is null, Cannot download!");
                                return UploadStatus.Download_From_Break_Failed;
                            }
                            out.flush();
                            in.close();
                            out.close();
                            boolean ftpStatus = ftpClient.completePendingCommand();
                            boolean upNewStatus = false;
                            if (process == 100) {
                                upNewStatus = true;
                            } else {
                                upNewStatus = false;
                            }

                            if (upNewStatus && ftpStatus) {
                                logger.info(Thread.currentThread().getName() + "Download successful");
                                result = UploadStatus.Download_From_Break_Success;

                            } else {

最奇怪的是,在客户现场有时会出现下载进度从1到100多的情况,下载不正常,实在不知道是什么原因造成的,从公式来看,进度process=ls / step,既然process超过一百了,就说明下载过程中文件莫名变大了,step是不变的,ls是累计的每次的偏移量,本来已经完了,输入流却还在源源不断的写到缓冲区,但是怎么可能啊,远程文件又没人动,不会莫名变大的,

另外,这是个多线程下载,但这里面所有东西都是线程安全的

求高手解答

加载中
0
薯粉1Q84
薯粉1Q84

这种进度条都很难做到精确,很多项目都是到最后直接显示99%,全部完成才显示100%,基本上没有好到办法。

返回顶部
顶部