定时下载ftp文件到本地


public class Ftp {
 
    private String ipAddr;//ip地址
    
    private Integer port;//端口号
    
    private String userName;//用户名
    
    private String pwd;//密码
    
    private String path;//aaa路径
 
    public String getIpAddr() {
        return ipAddr;
    }
 
    public void setIpAddr(String ipAddr) {
        this.ipAddr = ipAddr;
    }
 
    public Integer getPort() {
        return port;
    }
 
    public void setPort(Integer port) {
        this.port = port;
    }
 
    public String getUserName() {
        return userName;
    }
 
    public void setUserName(String userName) {
        this.userName = userName;
    }
 
    public String getPwd() {
        return pwd;
    }
 
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
 
    public String getPath() {
        return path;
    }
 
    public void setPath(String path) {
        this.path = path;
    }
    
    
}
 

import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

/*******************************************************************************
 * 功能说明: 从ftp服务器指定目录复制文件到本地指定路径
 * 
 * @author qianshu
 * @time 2012-6-25
 ******************************************************************************/
public class FtpDownFiles {

    private FTPClient ftpClient;

    public FtpDownFiles() {
        this.ftpClient = new FTPClient();
    }

    /**
     * 功能说明:通过递归实现ftp目录文件与本地文件同步更新
     * 
     * @param ftpfilepath
     *            当前ftp目录
     * @param localpath
     *            当前本地目录
     */
    public void ftpDownFiles(String ftpfilepath, String localpath) {

        try {

            //System.out.println(ftpfilepath);
            System.out.println(ftpfilepath);
            FTPFile[] ff = ftpClient.listFiles(ftpfilepath);
            
            // 得到当前ftp目录下的文件列表
            if (ff != null) {
                System.out.println(ff.length);
                for (int i = 0; i < ff.length; i++) {
                    //System.out.println(ff[i].getName());
                     System.out.println("文件名"+ff[i].getName());
                    
                    String localfilepath = localpath + ff[i].getName();
                     System.out.println(localfilepath);
                    File localFile = new File(localfilepath);
                    // 根据ftp文件生成相应本地文件
                    Date fflastModifiedDate = ff[i].getTimestamp().getTime();
                    // 获取ftp文件最后修改时间
                    Date localLastModifiedDate = new Date(localFile
                            .lastModified());
                    // 获取本地文件的最后修改时间
                    int result = localLastModifiedDate
                            .compareTo(fflastModifiedDate);
                    // result=0,两文件最后修改时间相同;result<0,本地文件的最后修改时间早于ftp文件最后修改时间;result>0,则相反
                    if (ff[i].isDirectory()) {
                         if(ff[i].getName().contains(".")) {
                             continue;
                         }
                        // 如果是目录
                        localFile.mkdir(); 
                        // 如果本地文件夹不存在就创建
                        String ftpfp = ftpfilepath + ff[i].getName() + "\\";
                        // 转到ftp文件夹目录下
                        String localfp = localfilepath + "\\";
                        // 转到本地文件夹目录下
                        this.ftpDownFiles(ftpfp, localfp);
                        // 递归调用

                    }
                    if (ff[i].isFile()) {
                        // 如果是文件
                        File lFile = new File(localpath);
                        lFile.mkdir();
                        // 如果文件所在的文件夹不存在就创建
                        if (!lFile.exists()) {
                            return;
                        }
                        if (ff[i].getSize() != localFile.length() || result < 0) {
                            // 如果ftp文件和本地文件大小不一样或者本地文件不存在或者ftp文件有更新,就进行创建、覆盖
                            String filepath = ftpfilepath + ff[i].getName();
                            // 目标ftp文件下载路径
                            FileOutputStream fos = new FileOutputStream(
                                    localFile);
                            boolean boo;
                            try {
                                boo = ftpClient.retrieveFile(new String(
                                        filepath.getBytes("UTF-8"),
                                        "ISO-8859-1"), fos);
                                // 从FTP服务器上取回一个文件
                            } catch (Exception e) {
                                boo = false;
                                e.printStackTrace();
                            }

                            if (boo == true) {
                                String name=ff[i].getName();
                                String dir=localpath;                               
                                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                                String time=sdf.format(localFile.lastModified());
//                                Start test=new Start();
//                                test.getConn(name, dir, time);
                                System.out.println(name+"   "+dir+"  "+time);
                            } else {

                            }

                            fos.flush();
                            // 将缓冲区中的数据全部写出
                            fos.close();
                            // 关闭流
                        } else {
                        //    System.out.println("两个文件相同!");
                        }
                    }

                }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }

    }
    

    /**
     * 功能说明:连接ftp服务器
     * 
     * @param hostip
     *            服务器地址
     * @param username
     *            用户名
     * @param password
     *            密码
     */
    public void connectServer(String hostip, String username, String password) {

        try {
            ftpClient.connect(hostip, 21);
            // 连接服务器
            ftpClient.login(username, password);
            // 登录
            // 检测是否连接成功
            int reply = ftpClient.getReplyCode();
            // 看返回的值是不是230,如果是,表示登陆成功
            if (!FTPReply.isPositiveCompletion(reply)) {
                // 返回的code>=200&&code<300return
                ftpClient.disconnect();
                // 关闭FTP连接
            }
            ftpClient.setControlEncoding("UTF-8");
            // 设置字符编码
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            // 设置文件传输格式

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }

    }

}
 

import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class TimerTask {
    //调用的工具
        public static void main(String[] args) {
            /**
             * Runnable:实现了Runnable接口,jdk就知道这个类是一个线程  
             */
            Runnable runnable = new Runnable() {
                //创建 run 方法
                public void run() {
                    long ksjs=new Date().getTime();
                    System.out.println("s1");
                    try {

                        FtpDownFiles fd = new FtpDownFiles();
                        fd.connectServer(ip, 用户,密码);
                        fd.ftpDownFiles("\\", "本地路径");

                    } catch (Exception e) {
                        System.out.println("读取异常");
                    }
                    long jsjs=new Date().getTime();
                    System.out.println("所用时间"+(jsjs-ksjs));
                }
            };
            // ScheduledExecutorService:是从Java SE5的java.util.concurrent里,
            // 做为并发工具类被引进的,这是最理想的定时任务实现方式。
            ScheduledExecutorService service = Executors
                    .newSingleThreadScheduledExecutor();
            // 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间
    
            // 第一次执行的时间为10秒,然后每隔1800秒执行一次
            service.scheduleAtFixedRate(runnable, 10, 1800, TimeUnit.SECONDS);
        }

}
 

package com.kwantler.YN_EW.service.impl; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class FilePhoto { /** * 从网络Url中下载文件 * * @param urlStr * @param fileName * @param savePath * @throws IOException */ public static void downLoadByUrl(String urlStr, String fileName, String savePath) throws IOException { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置超时间为3秒 conn.setConnectTimeout(5 * 1000); // 防止屏蔽程序抓取而返回403错误 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); // 得到输入流 InputStream inputStream = conn.getInputStream(); // 获取自己数组 byte[] getData = readInputStream(inputStream); // 文件保存位置 File saveDir = new File(savePath); if (!saveDir.exists()) { saveDir.mkdir(); } File file = new File(saveDir + File.separator + fileName); FileOutputStream fos = new FileOutputStream(file); fos.write(getData); if (fos != null) { fos.close(); } if (inputStream != null) { inputStream.close(); } System.out.println("info:" + url + " download success"); } /** * 从输入流中获取字节数组 * * @param inputStream * @return * @throws IOException */ public static byte[] readInputStream(InputStream inputStream) throws IOException { byte[] buffer = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while ((len = inputStream.read(buffer)) != -1) { bos.write(buffer, 0, len); } bos.close(); return bos.toByteArray(); } public static void main(String[] args) { try { downLoadByUrl( "https://www.mybiosource.com/images/tds/protocol_samples/MBS700_Antibody_Set_Sandwich_ELISA_Protocol.pdf", "ELISA.pdf", "E:/upload/protocol"); } catch (Exception e) { // TODO: handle exception } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值