`
stjauns
  • 浏览: 90466 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JAVA自动更新下载FTP服务器上的文件,带Swing进度。

    博客分类:
  • JAVA
阅读更多
使用ftp4j-1.5,见http://www.sauronsoftware.it/projects/ftp4j/index.php

界面如下:



1、登录到一个FTP服务器的特定文件夹,取回所有文件信息。
2、检索所有当前文件夹文件信息。
3、遍历所有远程服务器有的文件,若本地有此文件名的文件,则对比其大小。
4、下载所有远程服务器有而本地没有的文件和远程服务器文件大小与本地文件大小不同的文件。

功能简单,但足够使用了。

FTP实现代码:
package cn.stjauns.logan.updater;

import it.sauronsoftware.ftp4j.FTPAbortedException;
import it.sauronsoftware.ftp4j.FTPClient;
import it.sauronsoftware.ftp4j.FTPDataTransferException;
import it.sauronsoftware.ftp4j.FTPDataTransferListener;
import it.sauronsoftware.ftp4j.FTPException;
import it.sauronsoftware.ftp4j.FTPFile;
import it.sauronsoftware.ftp4j.FTPIllegalReplyException;
import it.sauronsoftware.ftp4j.FTPListParseException;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

import org.apache.log4j.Logger;

import cn.stjauns.logan.tools.CommonDlgUtil;
import cn.stjauns.logan.tools.CommonPropertiesUtil;
import cn.stjauns.logan.tools.CommonStringDateUtil;

public class Updater {
    private FTPClient client = new FTPClient();

    protected Monitor monitor = new Monitor();

    public void doTest() {
        logger.info(getLocalfiles());
    }

    /**
     * 更新
     * 
     * @throws FTPException
     * @throws FTPIllegalReplyException
     * @throws IOException
     * @throws IllegalStateException
     * @throws FTPListParseException
     * @throws FTPAbortedException
     * @throws FTPDataTransferException
     */
    public boolean doUpdate() throws IllegalStateException, IOException,
            FTPIllegalReplyException, FTPException, FTPDataTransferException,
            FTPAbortedException, FTPListParseException {
        monitor.setVisible(true);

        if (!connectToServer()) {
            return false;
        }

        // 取远程文件信息
        monitor.setText("取远程文件信息" + "...");
        Map<String, FileObject> remotefiles = getRemotefiles();
        if (remotefiles.size() == 0) {
            CommonDlgUtil.warning("警告", "更新服务器上没有文件!", monitor);
            return true;
        }

        // 取本地文件信息
        monitor.setText("取本地文件信息" + "...");
        Map<String, FileObject> localfiles = getLocalfiles();

        // 按远程文件信息对比本地文件信息\
        monitor.setText("对比文件信息" + "...");
        Iterator it = remotefiles.keySet().iterator();
        while (it.hasNext()) {
            String key = (String) it.next();
            if (localfiles.containsKey(key)) {
                logger.info("compare file :" + remotefiles.get(key) + ":"
                        + localfiles.get(key));
                if (localfiles.get(key).size == remotefiles.get(key).size) {
                    // 存在本地文件且大小相同,从远程文件集中删除
                    logger.info("remove remote file: " + remotefiles.get(key));
                    it.remove();
                    remotefiles.remove(key);
                }
            }

        }

        // 下载更新的文件
        doDownload(remotefiles);

        monitor.setText("退出登录" + "...");
        client.disconnect(true);

        return true;
    }

    /**
     * 按更新的远程文件集下载文件到当前目录覆盖同名文件
     * 
     * @param remotefiles
     * @throws FTPAbortedException
     * @throws FTPDataTransferException
     * @throws FTPException
     * @throws FTPIllegalReplyException
     * @throws IOException
     * @throws FileNotFoundException
     * @throws IllegalStateException
     */
    private void doDownload(Map<String, FileObject> remotefiles)
            throws IllegalStateException, FileNotFoundException, IOException,
            FTPIllegalReplyException, FTPException, FTPDataTransferException,
            FTPAbortedException {
        for (String key : remotefiles.keySet()) {
            monitor.total += remotefiles.get(key).size;
        }
        monitor.getJpg1().setMaximum(monitor.total);
        monitor.setText("开始下载文件" + "...");
        int i = 1;
        for (String filename : remotefiles.keySet()) {
            monitor.getJpg1().setString("下载文件:第" + i + "个/共" + remotefiles.size() + "个");
            listener.setFile(remotefiles.get(filename));
            client.download(filename, new File(System.getProperty("user.dir") + "/"
                    + filename), listener);
            i++;
        }
    }

    private TransferMonitor listener = new TransferMonitor(monitor);

    private Logger logger = Logger.getLogger(Updater.class);

    /**
     * 取本地文件夹的所有文件信息
     * 
     * @return
     */
    private Map<String, FileObject> getLocalfiles() {
        File f = new File(System.getProperty("user.dir"));
        Map<String, FileObject> rtn = new HashMap<String, FileObject>();
        if (f.isDirectory()) {
            for (File file : f.listFiles()) {
                FileObject fo = new FileObject();
                fo.filename = file.getName();
                fo.lasttime = CommonStringDateUtil.format(new Date(file.lastModified()));
                fo.size = file.length();
                rtn.put(fo.filename, fo);
                logger.info("add local file: " + fo);
            }
        }
        return rtn;
    }

    /**
     * 连接且登录到特定的FTP文件夹
     * 
     * @return
     * @throws FTPException
     * @throws FTPIllegalReplyException
     * @throws IOException
     * @throws IllegalStateException
     */
    private boolean connectToServer() throws IllegalStateException, IOException,
            FTPIllegalReplyException, FTPException {
        Properties prop = CommonPropertiesUtil.parseProp("/para.properties");

        String url = prop.getProperty("ftpserver", "127.0.0.1");
        monitor.setText("连接到系统升级服务器:" + url + "...");
        client.connect(url);

        String ftpuser = "user";
        String ftppwd = "pwd";
        monitor.setText("登录中" + "...");
        client.login(ftpuser, ftppwd);

        String path = prop.getProperty("path", "transms3jars");
        monitor.setText("查找目录:" + path + "...");
        client.changeDirectory(path);

        if (client.isCompressionSupported()) {
            logger.info("Compress = TRUE");
            client.setCompressionEnabled(true);
        }
        return true;
    }

    /**
     * 取服务器文件
     * 
     * @return
     * @throws FTPListParseException
     * @throws FTPAbortedException
     * @throws FTPDataTransferException
     * @throws FTPException
     * @throws FTPIllegalReplyException
     * @throws IOException
     * @throws IllegalStateException
     */
    private Map<String, FileObject> getRemotefiles() throws IllegalStateException,
            IOException, FTPIllegalReplyException, FTPException,
            FTPDataTransferException, FTPAbortedException, FTPListParseException {
        FTPFile[] files = client.list();
        Map<String, FileObject> rtn = new HashMap<String, FileObject>();
        for (FTPFile file : files) {
            if (".".equals(file.getName()) || "..".equals(file.getName())) {
                continue;
            }
            FileObject o = new FileObject();
            o.filename = file.getName();
            o.lasttime = CommonStringDateUtil.format(file.getModifiedDate());
            o.size = file.getSize();
            rtn.put(o.filename, o);
            logger.info("add remote file: " + o);
        }
        return rtn;
    }
}

class FileObject {
    String filename;

    String lasttime;

    long size;

    @Override
    public String toString() {
        return filename + "|" + lasttime + "|" + size;
    }
}

class TransferMonitor implements FTPDataTransferListener {
    private Monitor monitor = null;

    private FileObject fo = null;

    private Logger logger = Logger.getLogger(Updater.class);

    private int size = 0;

    public void setFile(FileObject f) {
        logger.info("TransferMonitor set file :" + f);
        fo = f;
        size = 0;
        monitor.getJpg2().setMaximum(((Long) fo.size).intValue());
        monitor.getJpg2().setValue(0);
        monitor.getJpg2().setString("下载中:" + fo.filename);
    }

    @Override
    public void aborted() {
        logger.info(fo + " aborted");
    }

    @Override
    public void completed() {
        logger.info(fo + " completed");
    }

    @Override
    public void failed() {
        logger.info(fo + " failed");
    }

    @Override
    public void started() {
        logger.info(fo + " started");
    }

    @Override
    public void transferred(int arg0) {
        monitor.getJpg2().setValue(size += arg0);
        monitor.getJpg1().setValue(monitor.current += arg0);
    }

    public TransferMonitor(Monitor monitor) {
        super();
        this.monitor = monitor;
    }

}


进度监控代码:
package cn.stjauns.logan.updater;

import javax.swing.JPanel;
import javax.swing.WindowConstants;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingConstants;
import java.awt.Color;

public class Monitor extends JFrame {

    private static final long serialVersionUID = 1L;

    public int total = 0;

    public int current = 0;

    private JPanel jContentPane = null;

    private JLabel jlb = null;

    private JProgressBar jpg1 = null;

    private JProgressBar jpg2 = null;

    /**
     * @param owner
     */
    public Monitor() {
        initialize();
    }

    public void setText(String text) {
        jlb.setText(text);
    }

    /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
        this.setSize(300, 200);
        this.setResizable(false);
        this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        this.setTitle("Transms3 AutoUpdater Version 0.1");
        this.setContentPane(getJContentPane());
        this.setLocationRelativeTo(null);
        this.setAlwaysOnTop(true);
    }

    /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jlb = new JLabel();
            jlb.setHorizontalAlignment(SwingConstants.CENTER);
            jlb.setForeground(Color.blue);
            jlb.setHorizontalTextPosition(SwingConstants.CENTER);
            GridLayout gridLayout = new GridLayout();
            gridLayout.setRows(3);
            jContentPane = new JPanel();
            jContentPane.setLayout(gridLayout);
            jContentPane.add(jlb, null);
            jContentPane.add(getJpg1(), null);
            jContentPane.add(getJpg2(), null);
        }
        return jContentPane;
    }

    /**
     * This method initializes jpg1
     * 
     * @return javax.swing.JProgressBar
     */
    protected JProgressBar getJpg1() {
        if (jpg1 == null) {
            jpg1 = new JProgressBar();
            jpg1.setStringPainted(true);
            jpg1.setString("总更新文件进度");
        }
        return jpg1;
    }

    /**
     * This method initializes jpg2
     * 
     * @return javax.swing.JProgressBar
     */
    protected JProgressBar getJpg2() {
        if (jpg2 == null) {
            jpg2 = new JProgressBar();
            jpg2.setStringPainted(true);
            jpg2.setString("当前更新文件进度");
        }
        return jpg2;
    }

}


源代码见附件。
  • 大小: 11.1 KB
分享到:
评论
1 楼 sunrise_king 2012-03-19  
很不错,以前没有想到可以显示下载的进度

相关推荐

    Java 基于Swing的FTP上传下载程序

    在这个项目中,Swing被用来构建用户界面,提供按钮、文本框等元素,让用户可以交互地输入FTP服务器的连接信息以及选择本地文件进行上传或下载。 FTP协议是一种用于网络上文件传输的标准协议,它允许用户在两台...

    java大文件上传至ftp服务器带进度条显示的

    总的来说,实现Java大文件上传至FTP服务器并显示同步进度条涉及的关键技术点包括:FTPClient的使用、文件的分块上传、多线程同步、GUI组件的更新以及异常处理。通过合理设计和优化,可以实现高效且用户体验良好的大...

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

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

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

    这个项目的核心是利用Java的FTP库来与FTP服务器进行通信,Swing则提供了友好的用户交互界面。在本项目中,用户可以通过简单的操作在本地计算机和FTP服务器之间进行文件管理。 首先,我们要理解FTP(File Transfer ...

    java实现ftp自动上传文件

    本项目是利用Java实现一个FTP自动上传文件的功能,特别关注的是将整个磁盘的所有文件及其子目录上传到FTP服务器。这个功能对于自动化运维、数据备份或者文件共享等场景非常实用。 首先,要实现FTP自动上传,我们...

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

    总的来说,这个Java Swing 文件批量上传DEMO涵盖了Java GUI编程、文件I/O、网络编程、多线程以及用户交互等多个方面,对于初学者来说,是一个很好的实践项目,可以帮助他们深入理解Java Swing的应用及文件上传的实现...

    JAVA swing (MVC)FTP客户端 (2)_javaftp客户端_familiarku3_

    这涉及到建立与FTP服务器的连接,登录,改变工作目录,列出目录内容,以及执行PUT(上传)和GET(下载)命令。在这个项目中,可能还实现了监控上传和下载速度的功能,这可能通过计算传输的字节数和时间来实现。 **5...

    基于Java Swing 的FTP客户端程序

    【Java Swing FTP客户端程序】是一种基于Java编程语言的图形用户界面(GUI)工具,用于实现文件传输协议(FTP)。在本文中,我们将深入探讨如何利用Java Swing构建一个FTP客户端,以及涉及的关键技术和概念。 首先...

    java Swing 多线程下载器

    此外,GUI也需要实时更新以反映下载进度,这可以通过使用Swing的事件驱动模型和模型-视图-控制器(MVC)设计模式来实现。 在实际编码中,可能会用到以下Java类和接口: 1. `javax.swing.JFrame`:作为主窗口。 2. `...

    java 图形自动更新程序

    Java图形自动更新程序是利用Java Swing库来构建的用户界面,结合Socket通信技术,实现软件的后台自动更新功能。在现代软件开发中,保持应用程序的最新状态至关重要,以确保用户可以享受到最新的特性和安全修复。Java...

    带进度条的FTP下载

    FTP(File Transfer Protocol)下载是网络上常见的文件传输方式,特别是在服务器管理和文件共享场景中。在实际应用中,为了提供更好的用户体验,我们通常会添加进度条功能,让用户能够直观地了解下载进度,同时配合...

    java FTP 文件传输

    在Java中实现文件上传,首先需要建立FTP连接,然后登录到FTP服务器。接着,可以使用`FTPClient`的`storeFile()`方法将本地文件上传到服务器。下载文件则使用`retrieveFile()`方法。 4. **断点续传**: 断点续传...

    用JAVA swing 模拟实现Ftp客户端的基本操作,可以看到上传下载的速度等.zip

    它允许用户从远程服务器上下载文件,或者将本地文件上传到服务器。在Java中,我们可以使用`java.net`包中的`Socket`和`DataInputStream`/`DataOutputStream`类来实现基本的FTP通信,但为了更方便地处理FTP操作,通常...

    Http下载器 FTP下载器(java)

    在IT行业中,网络下载是日常开发中不可或缺的一...综上所述,"Http下载器 FTP下载器(java)"项目涵盖了网络协议、文件I/O、多线程、异常处理等多个Java核心知识点,对于学习和实践网络编程及文件下载具有很高的价值。

    javaftp.rar_FTP界面_edtftpj.jar downlo_ftp 上传下载_java ftpClient fo

    在本项目中,Swing被用来创建FTP客户端的界面,包括按钮、文本框等组件,用户可以通过这些组件来输入FTP服务器信息、选择文件进行上传或下载。 3. **edtftpj.jar**:`edtftpj.jar`可能是一个第三方FTP库,它提供了...

    java写的ftp客户端源码

    java写的ftp客户端源码,很久之前了,用的是apache的net包里面的ftp功能,然后自己做了一些swing的操作界面,添加了上传下载速度进度,和图片预览功能。源码里面有Test类,因为是为了学习swing mvc才打算做一个的,...

Global site tag (gtag.js) - Google Analytics