• 扫描FTP,保存文件


    1、需求:某公司ftp服务器中一个文件夹中有30个文件(文件名字是不同的),每五分钟产生一个新的文件,同时删除这三十个文件中最早产生的文件,该文件夹中始终保持30个文件。

      现在需要采集一周的数据做研究。

      解决思路,用java扫描该文件夹,把所有产生的新文件保存到本地一个目录下,文件名持久化一个文本中,防止FTP出问题。一周后可以得到这一周的数据。

    下面是代码:

    package cim;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.SocketException;
    import java.util.List;
    
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPFile;
    import org.apache.commons.net.ftp.FTPReply;
    import org.apache.log4j.Logger;
    
    public class FtpUtil {
        static Logger logger = Logger.getLogger(FtpUtil.class);
        /**
         * 获取FTPClient对象
         * 
         * @param ftpHost
         *            FTP主机服务器
         * @param ftpPassword
         *            FTP 登录密码
         * @param ftpUserName
         *            FTP登录用户名
         * @param ftpPort
         *            FTP端口 默认为21
         * @return
         */
        static FTPClient ftpClient = null;
    
        public static FTPClient getFTPClient(String ftpHost, String ftpUserName,
                String ftpPassword, int ftpPort) {
            try {
                ftpClient = new FTPClient();
                ftpClient.setControlEncoding("GBK");
                ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
                ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器
                if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                    logger.info("未连接到FTP,用户名或密码错误。");
                    close();
                } else {
                    // logger.info("FTP连接成功。");
                }
            } catch (SocketException e) {
                e.printStackTrace();
                logger.info("FTP连接错误,请正确配置IP地址,账号和密码。");
            } catch (IOException e) {
                e.printStackTrace();
                logger.info("FTP的端口错误,请正确配置。");
            }
            return ftpClient;
        }
    
        /*
         * 从FTP服务器下载文件
         * 
         * @param ftpHost FTP IP地址
         * 
         * @param ftpUserName FTP 用户名
         * 
         * @param ftpPassword FTP用户名密码
         * 
         * @param ftpPort FTP端口
         * 
         * @param ftpPath FTP服务器中文件所在路径 格式: ftptest/aa
         * 
         * @param localPath 下载到本地的位置 格式:H:/download
         * 
         * @param txtAddress 本地文件名
         * 
         * @param time 扫描时间间隔
         */
        public static void downloadFtpFile(String ftpHost, String ftpUserName,
                String ftpPassword, int ftpPort, String ftpPath, String localPath,
                String txtAddress, int time) {
            while(ftpPort!=21){
                logger.info("检测到用户输入的端口号为:"+ftpPort+",现已修改为默认值21.");
                ftpPort = 21;
            }
            int fs0 = 0;// 定义初始化文件的个数为零
            for (int a = 0; a < 500000; a++) {
                FTPClient ftpClient = null;
                try {
                    ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword,ftpPort);
                    ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);// 设置文件类型为二进制否则可能导致乱码文件无法打开
                    ftpClient.enterLocalPassiveMode();// 设置被动模式
                    boolean dir = ftpClient.changeWorkingDirectory(ftpPath);
                    // System.out.println("进入指定FTP文件夹==>"+dir);
                    txtUtil txt = new txtUtil();
    
                    List<String> listStrings = null;
                    try {
                        listStrings = txt.readTxtFile(txtAddress);
                    } catch (Exception e1) {
                        System.out.println("警告:发现问题读取文本的时候,程序错误");
                        e1.printStackTrace();
                    }
                    System.out.println("第" + (a + 1) + "次循环的listStrings长度为:"+ listStrings.size());
                    if (dir) {
                        File file2 = null;
                        FTPFile[] fs = ftpClient.listFiles();
                        if (a == 0) {
                            for (int i = 0; i < fs.length; i++) {
                                boolean bo = listStrings.contains(fs[i].getName());
                                if (!bo) {
                                    if(fs[i].getName().endsWith("xml")){
                                        File file = new File(localPath);
                                        if (!file.exists() && !file.isDirectory()) {
                                            file.mkdir();
                                            logger.info("本地cim_download文件夹不存在,创建成功");
                                        }
                                        File localFile = new File(localPath
                                                + File.separatorChar + fs[i].getName());
                                        OutputStream os = new FileOutputStream(localFile);
                                        ftpClient.retrieveFile(fs[i].getName(), os);
                                        os.close();
                                        logger.info("首次启动文件复制成功:" + fs[i].getName()+ " 大小为:" + localFile.length() + "字节");
                                        txt.recordName(txtAddress, fs[i].getName());
                                        listStrings.add(fs[i].getName());
                                    }
                                } else {
                                    logger.info("首次启动发现:<" + fs[i].getName()+ ">,本地已存在,不再复制");
                                }
                            }
                        }else{
                            for (int i = 0; i < fs.length; i++) {
                                boolean bo = listStrings.contains(fs[i].getName());
                                if (!bo) {
                                    if(fs[i].getName().endsWith("xml")){
                                        System.out.println("发现新文件:" + fs[i].getName());
                                        try {
                                            Thread.sleep(500);
                                        } catch (InterruptedException e) {
                                            e.printStackTrace();
                                        }
                                        file2 = new File(localPath);
                                        if (!file2.exists() && !file2.isDirectory()) {
                                            file2.mkdir();
                                            logger.info("本地cim_download文件夹可能被误删,现已创建成功");
                                        }
                                        File localFile = new File(localPath+ File.separatorChar + fs[i].getName());
                                        OutputStream os = new FileOutputStream(localFile);
                                        ftpClient.retrieveFile(fs[i].getName(), os);
                                        os.close();
                                        logger.info("新文件:" + fs[i].getName() + "  复制成功");
                                        // listStrings.add(fs[i].getName());
                                        txt.recordName(txtAddress, fs[i].getName());
                                    }
                                }
                            }
                        }
                        
                        fs0 = fs.length;
                        try {
                            System.out.println("查询第" + (a + 1) + "次时,有" + fs0+ "个文件," + "下次扫描时间为" + time + "毫秒后。");
                            Thread.sleep(time);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                } catch(NullPointerException e){
                    logger.error("NullPointerException,创建连接为空。请检查FTP服务器"+"!!!"+e.getMessage());
                }catch (FileNotFoundException e) {
                    logger.error("FileNotFoundException"+e.getMessage());
                    e.printStackTrace();
                } catch (SocketException e) {
                    logger.error("连接FTP失败.");
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                    logger.error("文件读取错误。");
                    e.printStackTrace();
                } catch (Exception e) {
                    logger.error("未知异常!!!");
                } finally {
                    try {
                        close();
                    } catch (Exception e) {
                        logger.error("关闭FTP错误!"+e.getMessage());
                        e.printStackTrace();
                    }
                }
            }
        }
    
        /**
         * 转码[GBK -> ISO-8859-1] 不同的平台需要不同的转码
         * 
         * @param obj
         * @return
         */
        private static String gbkToIso8859(Object obj) {
            try {
                if (obj == null)
                    return "";
                else
                    return new String(obj.toString().getBytes("GBK"), "iso-8859-1");
            } catch (Exception e) {
                return "";
            }
        }
    
        /**
         * 转码[ISO-8859-1 -> GBK] 不同的平台需要不同的转码
         * 
         * @param obj
         * @return
         */
        private static String iso8859ToGbk(Object obj) {
            try {
                if (obj == null)
                    return "";
                else {
                    String str = new String(obj.toString().getBytes("iso-8859-1"),
                            "GBK");
                    return str;
                }
            } catch (Exception e) {
                return "";
            }
        }
    
        /**
         * 关闭当前连接
         */
        public static void close() {
            try {
                ftpClient.logout();
                ftpClient.disconnect();
            } catch (IOException e) {
                logger.error("ftp ftpserver close error : " + e.getMessage());
            }
        }
    }
    package cim;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    import java.util.List;
    
    public class txtUtil {
        
        public void recordName(String txtAddress,String name) throws IOException{
            File file = new File(txtAddress);
            if(!file.exists()){
                file.createNewFile();
            }
            FileWriter fw = new FileWriter(file, true);
            PrintWriter pw = new PrintWriter(fw);
            pw.print(name);
            pw.print(",");
            pw.flush();
            try {
                fw.flush();
                pw.close();
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        public  List<String> readTxtFile(String txtAddress)throws Exception{  
            List<String> list = new ArrayList<>();
            try {
                String encoding="UTF-8";
                File file=new File(txtAddress);
                if(!file.exists()){
                    file.createNewFile();
                }
                if(file.isFile() && file.exists()){ //判断文件是否存在
                    InputStreamReader read = new InputStreamReader(new FileInputStream(file),encoding);//考虑到编码格式
                    BufferedReader bufferedReader = new BufferedReader(read);
                    String lineTxt = null;
                    while((lineTxt = bufferedReader.readLine()) != null){
                        String[] sourceStrArray =lineTxt.split(",");
                        for(int i = 0 ;i<sourceStrArray.length;i++){
                            list.add(sourceStrArray[i]);
                        }
                    }
                    read.close();
                }else{ 
                    System.out.println("读取文件名集合出错");
                }
            }catch (Exception e) {
                System.out.println("读取文件内容出错");
                e.printStackTrace();
            }
            
            return list;
        }
    }
     1 package cim;
     2 
     3 import java.io.File;
     4 import java.util.HashMap;
     5 import java.util.Map;
     6 
     7 import javax.xml.parsers.DocumentBuilder;
     8 import javax.xml.parsers.DocumentBuilderFactory;
     9 
    10 import org.w3c.dom.Document;
    11 import org.w3c.dom.Element;
    12 import org.w3c.dom.Node;
    13 import org.w3c.dom.NodeList;
    14 
    15 public class ftpTest {
    16 
    17     public static void main(String[] args) {
    18         
    19         ftpTest test = new ftpTest();
    20         Map<String, Object> map = test.XMLReader();
    21         String ftpHost = (String) map.get("ftpHost");  
    22         String ftpUserName = (String) map.get("ftpUserName");  
    23         String ftpPassword = (String) map.get("ftpPassword");  
    24         int ftpPort = Integer.parseInt((String) map.get("ftpPort")) ;  
    25         String ftpPath = (String) map.get("ftpPath");  
    26         String localPath = (String) map.get("localPath");  
    27         String txtAddress = (String) map.get("txtAddress");  
    28         int time = Integer.parseInt((String)map.get("time"));  
    29         
    30         FtpUtil.downloadFtpFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath, localPath, txtAddress,time);  
    31     }
    32     
    33     public Map<String,Object> XMLReader(){
    34         Element element = null;
    35         File f = new File("test.xml");
    36         DocumentBuilder db = null;
    37         DocumentBuilderFactory dbf = null;
    38         Map<String, Object> map = new HashMap<>();
    39         try {
    40             dbf = DocumentBuilderFactory.newInstance();
    41             db = dbf.newDocumentBuilder();
    42             Document dt = db.parse(f);
    43             element = dt.getDocumentElement();
    44             NodeList childNodes = element.getChildNodes();
    45             for (int i = 0; i < childNodes.getLength(); i++) {
    46                 Node node1 = childNodes.item(i);
    47                 if ("Account".equals(node1.getNodeName())) {
    48                     NodeList nodeDetail = node1.getChildNodes();
    49                     for (int j = 0; j < nodeDetail.getLength(); j++) {
    50                         Node detail = nodeDetail.item(j);
    51                         if ("ftpHost".equals(detail.getNodeName())) 
    52                             map.put("ftpHost", detail.getTextContent());
    53                         else if ("ftpUserName".equals(detail.getNodeName())) 
    54                             map.put("ftpUserName", detail.getTextContent());
    55                         else if ("ftpPassword".equals(detail.getNodeName()))
    56                             map.put("ftpPassword", detail.getTextContent());
    57                         else if ("ftpPort".equals(detail.getNodeName())) 
    58                             map.put("ftpPort", detail.getTextContent());
    59                         else if ("ftpPath".equals(detail.getNodeName())) 
    60                             map.put("ftpPath", detail.getTextContent());
    61                         else if ("localPath".equals(detail.getNodeName())) 
    62                             map.put("localPath", detail.getTextContent());
    63                         else if ("txtAddress".equals(detail.getNodeName())) 
    64                             map.put("txtAddress", detail.getTextContent());
    65                         else if ("time".equals(detail.getNodeName())) 
    66                             map.put("time", detail.getTextContent());
    67                     }
    68                 }
    69             }
    70         } catch (Exception e) {
    71             e.printStackTrace();
    72         }
    73         return map;
    74     }
    75 }
    log4j.rootLogger=info,A1,A2
    # u8F93u51FAu5230u63A7u5236u53F0
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [u4fe1u606f] %m%n
    # u8F93u51FAu5230u6587u4EF6u5F53u4E2D
    log4j.appender.A2=org.apache.log4j.FileAppender
    log4j.appender.A2.File=cim_logging.log
    log4j.appender.A2.Append=true
    log4j.appender.A2.layout=org.apache.log4j.PatternLayout
    log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [u4fe1u606f] %m%n
    <?xml version="1.0" encoding="UTF-8"?>
    <Accounts>
     <Account type="type1">
    <!--  FTP端口号 -->
      <ftpHost>127.0.0.1</ftpHost>
    <!--   FTP账号 -->
      <ftpUserName>1</ftpUserName>
    <!--   FTP密码 -->
      <ftpPassword>1</ftpPassword>
    <!--   FTP端口号 -->
      <ftpPort>22</ftpPort>
    <!--   FTP路径 -->
      <ftpPath>users/ems/open2000e/data/xmldat/nari/all/</ftpPath>
    <!--   本地保存文件路径 -->
      <localPath>cim_download</localPath>
    <!--   本地保存文件名集合路径 -->
      <txtAddress>cim_name.txt</txtAddress>
    <!--   设置扫描文件的时间间隔,单位:毫秒 -->
      <time>5000</time>
     </Account>
    </Accounts>

    是用的main方法启动。

    Fat Jar打包插件方法    http://jingyan.baidu.com/article/da1091fbd7dae1027849d63b.html

    下面是运行jar包

     

  • 相关阅读:
    sql-字符串拼接单,双引号及$
    SQL-SQLServer数据库查询
    SQL-数据库不能以127.0.0.1登录
    Excel-VBA-ActiveX编译错误:用户定义类型未定义
    Excel-VBA中,取:存储过程时,报:对象关闭时,不允许操作!
    JS
    小程序(Wepy)--生成海报图片
    小程序--时间处理(显示几分钟前,,几小时前,,几天前...)
    小程序--wepy省市区三级联动选择
    对于 wepy 不是内部或外部命令 -- 的解决办法
  • 原文地址:https://www.cnblogs.com/acme6/p/7595613.html
Copyright © 2020-2023  润新知