你的位置:首页 > Java教程

[Java教程]ftp 根据特定正则匹配文件名 下载到本地 并且上传文件到ftp java 最爱那水货


 1    2   /** 3    * 建立FTP链接,FTP服务器地址、端口、登陆用户信息都在配置里配置即可。 4    * @throws IOException 5   */ 6   public boolean connectFtp(String ftpAddress, String ftpPort, String frpUserName, String frpPassword) throws IOException{ 7     log.info("*****连接FTP服务器...*****"); 8     try{ 9       ftpClient.connect(ftpAddress, Integer.valueOf(ftpPort).intValue()); 10       ftpClient.setControlEncoding("GB2312"); 11       int reply = ftpClient.getReplyCode(); 12       if(FTPReply.isPositiveCompletion(reply)){ 13         if(ftpClient.login(frpUserName,frpPassword)){ 14           log.info("*****连接FTP服务器成功!*****"); 15           return true; 16         } 17       }else{ 18         log.error("*****连接失败!响应代码为【"+ reply+"】*****"); 19       } 20       disconnect(); 21     }catch (Exception e) { 22       log.error("*****连接失败:" + e.getMessage()); 23     } 24     return false; 25   } 26    27   /** 28    * 设置FTP客户端 被动模式、数据模式为二进制、字符编码GBK 29   */ 30   public void setConnectType(){ 31     try { 32       ftpClient.enterLocalPassiveMode(); 33       ftpClient.setDefaultTimeout(1000 * 120);//120秒 34       ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 35       ftpClient.setControlEncoding("GB2312"); 36     } catch (IOException e) { 37       e.printStackTrace(); 38     } 39   } 40    41    42   /** 43    * 断开与远程服务器的连接 44    * @throws IOException 45   */ 46   public void disconnect() { 47     if(ftpClient.isConnected()){ 48       try { 49         ftpClient.disconnect(); 50       } catch (IOException e) { 51         e.printStackTrace(); 52       } 53     } 54   } 55  56    57   /** 58    * 过滤不符合的文件并批量下载   59    * @param remoteFileReg 文件前缀的正则表达式 60    * @param localPath 本地路径 .property 文件配置 61    * @param remote_down_path ftp文件路径 62    * @return List 下载到本地的文件路径 集合 63    * @throws IOException 64   */ 65   @SuppressWarnings("unchecked") 66   public List downloads(String remoteFileReg,String localPath,String remote_down_path) throws IOException{ 67     List<String> fileNames = new ArrayList<String>(); 68     log.info("*****转移到服务器目录:" + remote_down_path); 69     setConnectType(); 70     boolean changeFlag = ftpClient.changeWorkingDirectory(remote_down_path); 71     FTPFile[] files = ftpClient.listFiles(); 72     //String[] names = ftpClient.listNames(); 73     log.info("*****改变目录是否成功:" + changeFlag); 74     log.info("*****服务器上report目录下所有校验报告的文件数为:【" +files.length + "】" ); 75     if(files.length == 0){ 76       log.info("*****未在服务器上找到文件!*****"); 77       return null; 78     }else{//目录下有文件 79       //把 bak文件的前缀找出来  ,区分读取和未读取的xls 和 xlsx ,只下载 未读取的文件  80       List<String> bakList = new ArrayList<String>(); 81       List<String> list = new ArrayList<String>(); 82        83       for (int i = 0; i < files.length; i++) { 84         FTPFile ftpFile = files[i]; 85         String fileName = ftpFile.getName(); 86          87         if(!fileName.endsWith(".bak") && ftpFile == null){ 88           log.info("******* "+ fileName + "文件无数据!"); 89           continue; 90         } 91          92         //匹配指定的文件前缀 和后缀 为  .bak 格式的文件 93         //bak 文件是文件读取完毕后生成的标记文件 94         Pattern bak = Pattern.compile("^"+remoteFileReg+"\\.bak"); 95         Matcher m = bak.matcher(fileName);  96         if (m.find()) { 97           //取.bak文件的 前缀 98           //System.out.println(fileName); 99           //System.out.println(fileName.split("\\.")[0]);100           bakList.add(fileName.split("\\.")[0]);101           continue;102         }103         104         //匹配指定的文件前缀 和后缀 为  .xls  .xlsx 格式的文件105         //TODO 以后遇到其他的格式文件 需要把后缀抽出来作为参数传入106         Pattern xls = Pattern.compile("^"+remoteFileReg+"\\.xls$"+"|"+"^"+remoteFileReg+"\\.xlsx$"+"|"+"^"+remoteFileReg+"\\.csv$");107         Matcher mm = xls.matcher(fileName);108         if(mm.find()){109           list.add(fileName);110           continue;111         }112       }113     114       //过滤掉 已解析的文件115       for (int i = 0; i < list.size(); i++) {116         String xls = list.get(i);117         for (String bak : bakList) {118           //bak文件存在 , 去掉此文件119           if (xls.indexOf(bak) !=-1) {120             list.remove(i);121           }122         }123       }124       125       for (String fFile : list) {126         //下载未读取的文件127         File downFile = new File(localPath + fFile); 128         //System.out.println(localPath);129         File downPath = new File(localPath);130         if(!downPath.exists()){131           downPath.mkdirs();132         }133         String fileDir = remote_down_path + fFile;134         OutputStream os = new FileOutputStream(downFile);135         ftpClient.retrieveFile(new String(fileDir.getBytes("GB2312"),"ISO-8859-1"), os);136         log.info("*****文件已下载到:" + downFile.getAbsolutePath() + "******");137         fileNames.add(downFile.getAbsolutePath());138         os.close();  139       }140       log.info("**** 此次共下载了"+list.size()+"个文件! *****");141     }142     return fileNames;143   }144   145   /**146    * 上传标志文件147    * @param remoteFile148    * @param localFile149    * @return150   */151   public boolean upload(String localFileName,String remoteFileName){152     153     boolean b = false;154     try {155       File file = new File(localFileName);   156       FileInputStream input = new FileInputStream(file);157       b = ftpClient.changeWorkingDirectory(remoteFileName);158       log.info("*****改变目录是否成功:" + b);159       String remoteFile = remoteFileName + file.getName();160       b = ftpClient.storeFile(new String(remoteFile.getBytes("GB2312"),"ISO-8859-1"), input);161       if(b){162         log.info(" ****** 标志文件"+localFileName+"上传成功!");163       }164       input.close();165     } catch (FileNotFoundException e) {166       e.printStackTrace();167     } catch (IOException e) {168       e.printStackTrace();169     }    170     return b;171   }