package com.xue; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MyTextUtil { public static String ascii2string(String oldText) { System.out.println(oldText); if (oldText == null || oldText.equals("")) { return ""; } String newText = null; Character character = (char) Integer.parseInt(oldText.trim()); newText = character.toString(); return newText; } public static String hex2int(String oldNumber) { if (oldNumber == null || oldNumber.equals("")) { return ""; } return Integer.valueOf(oldNumber, 16).toString(); } public static String hexSequense2String(String sequence, String spilitChar) { StringBuffer result = new StringBuffer(""); String[] split = sequence.split(spilitChar); for (String string : split) { System.out.println(string); result.append(ascii2string(hex2int(string))); } return result.toString(); } public static String getStringFromString(String src,String regex,int groupAt){ Pattern pattern = Pattern.compile(regex); Matcher matcher =pattern.matcher(src); boolean matches = matcher.find(); if (matches) { String group = matcher.group(groupAt); return group; }else { throw new RuntimeException(); } } public static String[] getStringFromString(String src,String regex,int[] groupAt){ String[] result=new String[groupAt.length]; Pattern pattern = Pattern.compile(regex); Matcher matcher =pattern.matcher(src); boolean matches = matcher.find(); if (matches) { for (int i = 0; i < groupAt.length; i++) { String group = matcher.group(groupAt[i]); result[i]=group; } return result; }else { throw new RuntimeException(); } } public static String[] getStringFromString(String src,String regex,int[] groupAt, Pattern pattern){ String[] result=new String[groupAt.length]; Matcher matcher =pattern.matcher(src); boolean matches = matcher.find(); if (matches) { for (int i = 0; i < groupAt.length; i++) { String group = matcher.group(groupAt[i]); result[i]=group; } return result; }else { throw new RuntimeException(); } } public static String getTextFromFile(File file) throws UnsupportedEncodingException { try { return getTextFromFile(new FileInputStream(file)); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public static String getTextFromFile(InputStream inputStream) throws UnsupportedEncodingException { StringBuffer buffer=new StringBuffer(); Scanner scanner=new Scanner(inputStream); while (scanner.hasNextLine()) { buffer.append(scanner.nextLine()+"\n"); } return new String(buffer.toString().getBytes(),"UTF-8"); } public static String getTextFromFile(File file,String CharSet) { FileInputStream fileInputStream; try { fileInputStream = new FileInputStream(file); byte[] b=new byte[1024]; byte[] B=new byte[0]; int read =-1; while ((read=fileInputStream.read(b))>-1) { int i=B.length; B=Arrays.copyOf(B, B.length+read); for(int j=0;j<read;j++){ B[i+j]=b[j]; } } return new String(B,CharSet); } catch (FileNotFoundException e) { System.out.println(file.getAbsolutePath()); e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public static String[] getArrayFromString(String bodyText, String oneDataRegex) { String[] strings=new String[]{}; java.util.List<String> list=new ArrayList<String>(); Pattern compile = Pattern.compile(oneDataRegex); Matcher matcher = compile.matcher(bodyText); while (matcher.find()) { String group = matcher.group(); list.add(group); } return list.toArray(strings); } }
package com.xue; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.SocketException; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import com.xue.FtpMain.Conf; public class FtpMain { private static Conf conf = null; /*** * 入口方法 该类的作用是利用FTPClient 实现将远程的文件下载到本地目录下, 而且是将远程的目录结构从跟目录开始重建 * 比如远程目录是/c/b/d.txt 本地存储根目录是/cd/f/ 则最终拷贝的目录是/cd/f/c/b/d.txt * * @param args * @throws SocketException * @throws IOException */ public static void main(String[] args) throws SocketException, IOException { conf = Conf.loadConf();// 加载配置文件 System.out.println(conf); FTPClient client = new FTPClient(); client.connect(conf.getHost(), 21); boolean login = client.login(conf.getUsername(), conf.getPass()); client.enterLocalPassiveMode();// 非常重要 设置成被动模式 String rootpath = conf.getRootPath(); client.changeWorkingDirectory(rootpath); // 递归远程目录的文件,实现递归式下载 digui(client, rootpath); client.disconnect(); } /*** * 递归远程目录,并根据配置实现符合条件的文件名的下载 * * @param client * @param rootpath * @throws IOException */ private static void digui(FTPClient client, String rootpath) throws IOException { client.changeWorkingDirectory(rootpath); FTPFile[] listFiles = client.listFiles(); for (FTPFile ftpFile : listFiles) { if (ftpFile.isDirectory()) { digui(client, rootpath + "/" + ftpFile.getName()); client.changeToParentDirectory();// 跳出当前目录 此处非常重要,否则会出现bug } else { String fileName = ftpFile.getName(); boolean matches = fileName.matches(conf.getFileameExp()); if (matches) { System.out.println("正在下载文件:" + rootpath + "/" + fileName); String filePath = conf.getDesPath() + "/" + rootpath + "/"; boolean exists = new File(filePath).exists(); if (!exists) { new File(filePath).mkdirs(); } File file = new File(filePath + fileName); client.retrieveFile(fileName, new FileOutputStream(file)); String replyString = client.getReplyString(); System.out.println(replyString); System.out.println("下载完成:" + file.getAbsolutePath()); } } } } /** * 配置加载类 * * @author bobo * */ static class Conf { private String host; private String username; private String pass; private String rootPath; private String soucrePath; private String desPath; private String fileameExp; private Map<String, String> confMap; public static Conf loadConf() { Conf result = new Conf(); Map<String, String> map = new HashMap<String, String>(); try { String textFromFile = MyTextUtil.getTextFromFile(new File("conf/conf.conf")); String[] split = textFromFile.split("\n"); for (String string : split) { if (string.startsWith("#")) { continue; } String[] split2 = string.split("="); map.put(split2[0], split2[1]); } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } result.confMap = map; return result; } public String getHost() { return confMap.get("host"); } public String getUsername() { return confMap.get("username"); } public String getPass() { return confMap.get("pass"); } public String getRootPath() { return confMap.get("rootPath"); } public String getSoucrePath() { return confMap.get("soucrePath"); } public String getDesPath() { return confMap.get("desPath"); } public String getFileameExp() { return confMap.get("fileameExp"); } @Override public String toString() { // TODO Auto-generated method stub String result = super.toString(); ; result += "\n conf-info:\n"; Set<String> keySet = this.confMap.keySet(); for (String key : keySet) { String value = this.confMap.get(key); result += key + "\t" + value + "\n"; } return result; } } }