在项目中使用到FTP功能,于是采用类似Spring的各种回调机制公用各种代码,减少代码的开发量,简化开发人员的学习难度.本文仅供学习交流使用,如有比较好的意见希望可以一起交流,再次表示感谢.
package easyway.tbs.transfer.ftp; import java.io.IOException; import org.apache.commons.net.ftp.FTPClient; /** * FTPCLient回调 * @author longgangabai * * @param <T> */ public interface FTPClientCallback<T> { public T doTransfer(FTPClient ftp)throws IOException; }
package easyway.tbs.transfer.ftp; import java.io.IOException; import java.util.Collection; import org.apache.commons.net.ftp.FTPFile; /** * FTP操作的客户端操作上传下载 * @author longgangbai * */ public interface FTPClientOperations { /** * 文件上传的方法 * @param remote * @param local * @return * @throws IOException */ public UploadStatus upload(String remote, String local) throws IOException; /** * * 从远程服务器目录下载文件到本地服务器目录中 * @param localdir FTP服务器保存目录 * @param remotedir FTP下载服务器目录 * @param localTempFile临时下载记录文件 * @return 成功返回true,否则返回false */ public Collection<String> downloadList(final String localdir, final String remotedir,final String localTmpFile) throws IOException; /** * 文件下载的方法 * @param remote * @param local * @return * @throws IOException */ public DownloadStatus downloadFile( String local,String remote) throws IOException; /** * 查看服务器上文件列表方法 * @param remotedir * @return * @throws IOException */ public FTPFile[] list(final String remotedir) throws IOException; }
package easyway.tbs.transfer.ftp; import java.io.File; import java.io.IOException; import java.net.ConnectException; import java.util.ArrayList; import java.util.Collection; import java.util.Properties; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPClientConfig; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import org.apache.log4j.Logger; import easyway.tbs.commons.FileOperateUtils; /** * Ftp回调模板 * * @author longgangbai * */ public class FTPClientTemplate implements FTPClientOperations{ private static final Logger logger = Logger.getLogger(FTPClientTemplate.class); private static String DEAFULT_REMOTE_CHARSET="UTF-8"; private static int DEAFULT_REMOTE_PORT=21; private static String separator = File.separator; private FTPClientConfig ftpClientConfig; private String host; private String username; private String password; private String port; public FTPClientTemplate(String host,String user,String pwd,String port){ this.host=host; this.username=user; this.password=pwd; this.port=port; } /** * 查看服务器上文件列表方法 * @param remotedir * @return * @throws IOException */ public FTPFile[] list(final String remotedir) throws IOException{ return execute(new FTPClientCallback<FTPFile[]>(){ public FTPFile[] doTransfer(FTPClient ftp) throws IOException { ftp.changeWorkingDirectory(remotedir); FTPFile[] files= ftp.listFiles(remotedir); return files; } }); } /** * 文件上传的方法 * @param remote * @param local * @return * @throws IOException */ public UploadStatus upload(final String local,final String remote) throws IOException{ return execute(new FTPClientCallback<UploadStatus>(){ public UploadStatus doTransfer(FTPClient ftpClient)throws IOException { return FtpHelper.getInstance().upload(ftpClient, local, remote); } }); } /** * 上传文件到服务器,新上传和断点续传 * @param remoteFile 远程文件名,在上传之前已经将服务器工作目录做了改变 * @param localFile 本地文件File句柄,绝对路径 * @param processStep 需要显示的处理进度步进值 * @param ftpClient FTPClient引用 * @return * @throws IOException */ public UploadStatus uploadFile(String remoteFile, File localFile, FTPClient ftpClient, long remoteSize) throws IOException { return FtpHelper.getInstance().uploadFile(remoteFile, localFile, ftpClient, remoteSize); } /** * 从远程服务器目录下载文件到本地服务器目录中 * @param localdir FTP服务器保存目录 * @param remotedir FTP下载服务器目录 * @param localTempFile临时下载记录文件 * @return 成功下载记录 */ public Collection<String> downloadList(final String localdir, final String remotedir,final String localTmpFile) throws IOException { return execute(new FTPClientCallback<Collection<String>>(){ public Collection<String> doTransfer(final FTPClient ftp) throws IOException { //切换到下载目录的中 ftp.changeWorkingDirectory(remotedir); //获取目录中所有的文件信息 FTPFile[] ftpfiles=ftp.listFiles(); Collection<String> fileNamesCol=new ArrayList<String>(); //判断文件目录是否为空 if(!ArrayUtils.isEmpty(ftpfiles)){ for (FTPFile ftpfile : ftpfiles) { String remoteFilePath=remotedir+separator+ftpfile.getName(); String localFilePath=localdir+separator+ftpfile.getName(); System.out.println("remoteFilePath ="+remoteFilePath +" localFilePath="+localFilePath); //单个文件下载状态 DownloadStatus downStatus=downloadFile(remoteFilePath, localFilePath); if(downStatus==DownloadStatus.Download_New_Success){ //临时目录中添加记录信息 fileNamesCol.add(remoteFilePath); } } } if(CollectionUtils.isNotEmpty(fileNamesCol)){ FileOperateUtils.writeLinesToFile(fileNamesCol, localTmpFile); } return fileNamesCol; } }); } /** * 从FTP服务器上下载文件,支持断点续传,上传百分比汇报 * @param remote 远程文件路径 * @param local 本地文件路径 * @return 上传的状态 * @throws IOException * */ public DownloadStatus downloadFile(final String remote, final String local) throws IOException{ return execute(new FTPClientCallback<DownloadStatus>(){ public DownloadStatus doTransfer(FTPClient ftpClient) throws IOException { DownloadStatus result=FtpHelper.getInstance().download(ftpClient, remote, local); return result; } }); } /** * 执行FTP回调操作的方法 * @param callback 回调的函数 * @throws IOException */ public <T> T execute(FTPClientCallback<T> callback) throws IOException{ FTPClient ftp=new FTPClient(); try { /*if(getFtpClientConfig()!=null){ ftp.configure(getFtpClientConfig()); ftpClientConfig.setServerTimeZoneId(TimeZone.getDefault().getID()); }*/ //登录FTP服务器 try { //设置超时时间 ftp.setDataTimeout(7200); //设置默认编码 ftp.setControlEncoding(DEAFULT_REMOTE_CHARSET); //设置默认端口 ftp.setDefaultPort(DEAFULT_REMOTE_PORT); //设置是否显示隐藏文件 ftp.setListHiddenFiles(false); //连接ftp服务器 if(StringUtils.isNotEmpty(port)&&NumberUtils.isDigits(port)){ ftp.connect(host, Integer.valueOf(port)); }else{ ftp.connect(host); } } catch(ConnectException e) { logger.error("连接FTP服务器失败:"+ftp.getReplyString()+ftp.getReplyCode()); throw new IOException("Problem connecting the FTP-server fail",e); } //得到连接的返回编码 int reply=ftp.getReplyCode(); if(!FTPReply.isPositiveCompletion(reply)){ ftp.disconnect(); } //登录失败权限验证失败 if(!ftp.login(getUsername(), getPassword())) { ftp.quit(); ftp.disconnect(); logger.error("连接FTP服务器用户或者密码失败::"+ftp.getReplyString()); throw new IOException("Cant Authentificate to FTP-Server"); } if(logger.isDebugEnabled()){ logger.info("成功登录FTP服务器:"+host+" 端口:"+port); } ftp.setFileType(FTPClient.BINARY_FILE_TYPE); //回调FTP的操作 return callback.doTransfer(ftp); }finally{ //FTP退出 ftp.logout(); //断开FTP连接 if(ftp.isConnected()){ ftp.disconnect(); } } } protected String resolveFile(String file) { return null; //return file.replace(System.getProperty("file.separator").charAt(0), this.remoteFileSep.charAt(0)); } /** * 获取FTP的配置操作系统 * @return */ public FTPClientConfig getFtpClientConfig() { //获得系统属性集 Properties props=System.getProperties(); //操作系统名称 String osname=props.getProperty("os.name"); //针对window系统 if(osname.equalsIgnoreCase("Windows XP")){ ftpClientConfig=new FTPClientConfig(FTPClientConfig.SYST_NT); //针对linux系统 }else if(osname.equalsIgnoreCase("Linux")){ ftpClientConfig=new FTPClientConfig(FTPClientConfig.SYST_UNIX); } if(logger.isDebugEnabled()){ logger.info("the ftp client system os Name "+osname); } return ftpClientConfig; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
package easyway.tbs.transfer.ftp; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.RandomAccessFile; import java.util.StringTokenizer; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; /** * FTP下载工具类 * @author longgangbai * */ public class FtpHelper { private static String DEAFULT_REMOTE_CHARSET="GBK"; private static String DEAFULT_LOCAL_CHARSET="iso-8859-1"; private static FtpHelper instance=new FtpHelper(); public static FtpHelper getInstance(){ return instance; } /** * 连接到FTP服务器 * @param hostname主机名 * @param port 端口 * @param username 用户名 * @param password 密码 * @return 是否连接成功 * @throws IOException */ public boolean connect(FTPClient ftpClient,String hostname, int port, String username,String password) throws IOException { ftpClient.connect(hostname, port); ftpClient.setControlEncoding(DEAFULT_REMOTE_CHARSET); if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { if (ftpClient.login(username, password)) { return true; } } disconnect(ftpClient); return false; } /** * 从FTP服务器上下载文件,支持断点续传,上传百分比汇报 * @param remoteFilePath 远程文件路径 * @param localFilePath 本地文件路径 * @return 上传的状态 * @throws IOException */ public DownloadStatus download(FTPClient ftpClient,String remoteFilePath, String localFilePath) throws IOException { // 设置被动模式 ftpClient.enterLocalPassiveMode(); // 设置以二进制方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); DownloadStatus result; // 检查远程文件是否存在 FTPFile[] files = ftpClient.listFiles(new String( remoteFilePath.getBytes(DEAFULT_REMOTE_CHARSET), DEAFULT_LOCAL_CHARSET)); if (files.length != 1) { System.out.println("远程文件不存在"); return DownloadStatus.Remote_File_Noexist; } long lRemoteSize = files[0].getSize(); File f = new File(localFilePath); // 本地存在文件,进行断点下载 if (f.exists()) { long localSize = f.length(); // 判断本地文件大小是否大于远程文件大小 if (localSize >= lRemoteSize) { System.out.println("本地文件大于远程文件,下载中止"); return DownloadStatus.Local_Bigger_Remote; } // 进行断点续传,并记录状态 FileOutputStream out = new FileOutputStream(f, true); ftpClient.setRestartOffset(localSize); InputStream in = ftpClient.retrieveFileStream(new String(remoteFilePath .getBytes(DEAFULT_REMOTE_CHARSET), DEAFULT_LOCAL_CHARSET)); byte[] bytes = new byte[1024]; long step = lRemoteSize / 100; long process = localSize / step; int c; while ((c = in.read(bytes)) != -1) { out.write(bytes, 0, c); localSize += c; long nowProcess = localSize / step; if (nowProcess > process) { process = nowProcess; if (process % 10 == 0){ System.out.println("下载进度:" + process); } // TODO 更新文件下载进度,值存放在process变量中 } } in.close(); out.close(); boolean isDo = ftpClient.completePendingCommand(); if (isDo) { result = DownloadStatus.Download_From_Break_Success; } else { result = DownloadStatus.Download_From_Break_Failed; } } else { OutputStream out = new FileOutputStream(f); InputStream in = ftpClient.retrieveFileStream(new String(remoteFilePath .getBytes(DEAFULT_REMOTE_CHARSET), DEAFULT_LOCAL_CHARSET)); byte[] bytes = new byte[1024]; long step = lRemoteSize / 100; long process = 0; long localSize = 0L; int c; while ((c = in.read(bytes)) != -1) { out.write(bytes, 0, c); localSize += c; long nowProcess = localSize / step; if (nowProcess > process) { process = nowProcess; if (process % 10 == 0){ System.out.println("下载进度:" + process); } // TODO 更新文件下载进度,值存放在process变量中 } } in.close(); out.close(); boolean upNewStatus = ftpClient.completePendingCommand(); if (upNewStatus) { result = DownloadStatus.Download_New_Success; } else { result = DownloadStatus.Download_New_Failed; } } return result; } /** * * 上传文件到FTP服务器,支持断点续传 * @param localFilePath 本地文件名称,绝对路径 * @param remoteFilePath 远程文件路径,使用/home/directory1/subdirectory/file.ext * 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构 * @return 上传结果 * @throws IOException */ public UploadStatus upload(FTPClient ftpClient,String localFilePath, String remoteFilePath) throws IOException { // 设置PassiveMode传输 ftpClient.enterLocalPassiveMode(); // 设置以二进制流的方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.setControlEncoding(DEAFULT_REMOTE_CHARSET); UploadStatus result; // 对远程目录的处理 String remoteFileName = remoteFilePath; if (remoteFilePath.contains("/")) { remoteFileName = remoteFilePath.substring(remoteFilePath.lastIndexOf("/") + 1); // 创建服务器远程目录结构,创建失败直接返回 if (createDirecroty(remoteFilePath, ftpClient) == UploadStatus.Create_Directory_Fail) { return UploadStatus.Create_Directory_Fail; } } // ftpClient.feat(); // System.out.println( ftpClient.getReply()); // System.out.println( ftpClient.acct(null)); // System.out.println(ftpClient.getReplyCode()); // System.out.println(ftpClient.getReplyString()); // 检查远程是否存在文件 FTPFile[] files = ftpClient.listFiles(new String(remoteFileName .getBytes(DEAFULT_REMOTE_CHARSET), DEAFULT_LOCAL_CHARSET)); if (files.length == 1) { long remoteSize = files[0].getSize(); File f = new File(localFilePath); long localSize = f.length(); if (remoteSize == localSize) { // 文件存在 return UploadStatus.File_Exits; } else if (remoteSize > localSize) { return UploadStatus.Remote_Bigger_Local; } // 尝试移动文件内读取指针,实现断点续传 result = uploadFile(remoteFileName, f, ftpClient, remoteSize); // 如果断点续传没有成功,则删除服务器上文件,重新上传 if (result == UploadStatus.Upload_From_Break_Failed) { if (!ftpClient.deleteFile(remoteFileName)) { return UploadStatus.Delete_Remote_Faild; } result = uploadFile(remoteFileName, f, ftpClient, 0); } } else { result = uploadFile(remoteFileName, new File(localFilePath), ftpClient, 0); } return result; } /** * * 断开与远程服务器的连接 * @throws IOException */ public void disconnect(FTPClient ftpClient) throws IOException { if (ftpClient.isConnected()) { ftpClient.disconnect(); } } /** * 递归创建远程服务器目录 * @param remote 远程服务器文件绝对路径 * @param ftpClient FTPClient对象 * @return 目录创建是否成功 * @throws IOException */ public UploadStatus createDirecroty(String remote, FTPClient ftpClient) throws IOException { UploadStatus status = UploadStatus.Create_Directory_Success; String directory = remote.substring(0, remote.lastIndexOf("/") + 1); if (!directory.equalsIgnoreCase("/") && !ftpClient.changeWorkingDirectory(new String(directory .getBytes(DEAFULT_REMOTE_CHARSET), DEAFULT_LOCAL_CHARSET))) { // 如果远程目录不存在,则递归创建远程服务器目录 int start = 0; int end = 0; if (directory.startsWith("/")) { start = 1; } else { start = 0; } end = directory.indexOf("/", start); while (true) { String subDirectory = new String(remote.substring(start, end) .getBytes(DEAFULT_REMOTE_CHARSET), DEAFULT_LOCAL_CHARSET); if (!ftpClient.changeWorkingDirectory(subDirectory)) { if (ftpClient.makeDirectory(subDirectory)) { ftpClient.changeWorkingDirectory(subDirectory); } else { System.out.println("创建目录失败"); return UploadStatus.Create_Directory_Fail; } } start = end + 1; end = directory.indexOf("/", start); // 检查所有目录是否创建完毕 if (end <= start) { break; } } } return status; } /** * 上传文件到服务器,新上传和断点续传 * @param remoteFile 远程文件名,在上传之前已经将服务器工作目录做了改变 * @param localFile 本地文件File句柄,绝对路径 * @param processStep 需要显示的处理进度步进值 * @param ftpClient FTPClient引用 * @return * @throws IOException */ public UploadStatus uploadFile(String remoteFile, File localFile, FTPClient ftpClient, long remoteSize) throws IOException { UploadStatus status; // 显示进度的上传 long step = localFile.length() / 100; long process = 0; long localreadbytes = 0L; RandomAccessFile raf = new RandomAccessFile(localFile, "r"); String remote = new String(remoteFile.getBytes(DEAFULT_REMOTE_CHARSET), DEAFULT_LOCAL_CHARSET); OutputStream out = ftpClient.appendFileStream(remote); if (out == null) { String message = ftpClient.getReplyString(); throw new RuntimeException(message); } // 断点续传 if (remoteSize > 0) { ftpClient.setRestartOffset(remoteSize); process = remoteSize / step; raf.seek(remoteSize); localreadbytes = remoteSize; } byte[] bytes = new byte[1024]; int c; while ((c = raf.read(bytes)) != -1) { out.write(bytes, 0, c); localreadbytes += c; if (localreadbytes / step != process) { process = localreadbytes / step; System.out.println("上传进度:" + process); // TODO 汇报上传状态 } } out.flush(); raf.close(); out.close(); boolean result = ftpClient.completePendingCommand(); if (remoteSize > 0) { status = result ? UploadStatus.Upload_From_Break_Success : UploadStatus.Upload_From_Break_Failed; } else { status = result ? UploadStatus.Upload_New_File_Success : UploadStatus.Upload_New_File_Failed; } return status; } protected void makeRemoteDir(FTPClient ftp, String dir) throws IOException { String workingDirectory = ftp.printWorkingDirectory(); if (dir.indexOf("/") == 0) { ftp.changeWorkingDirectory("/"); } String subdir = new String(); StringTokenizer st = new StringTokenizer(dir, "/"); while (st.hasMoreTokens()) { subdir = st.nextToken(); if (!(ftp.changeWorkingDirectory(subdir))) { if (!(ftp.makeDirectory(subdir))) { int rc = ftp.getReplyCode(); if (((rc != 550) && (rc != 553) && (rc != 521))) { throw new IOException("could not create directory: " + ftp.getReplyString()); } } else { ftp.changeWorkingDirectory(subdir); } } } if (workingDirectory != null){ ftp.changeWorkingDirectory(workingDirectory); } } /** * 获取指定目录下的文件名称列表 * @param currentDir * 需要获取其子目录的当前目录名称 * @return 返回子目录字符串数组 */ public String[] GetFileNames(FTPClient ftpClient,String currentDir) { String[] dirs = null; try { if (currentDir == null) dirs = ftpClient.listNames(); else dirs = ftpClient.listNames(currentDir); } catch (IOException e) { e.printStackTrace(); } return dirs; } /** * 获取指定目录下的文件与目录信息集合 * @param currentDir * 指定的当前目录 * @return 返回的文件集合 */ public FTPFile[] GetDirAndFilesInfo(FTPClient ftpClient,String currentDir) { FTPFile[] files = null; try { if (currentDir == null) files = ftpClient.listFiles(); else files = ftpClient.listFiles(currentDir); } catch (IOException ex) { ex.printStackTrace(); } return files; } }
package easyway.tbs.transfer.ftp; import easyway.tbs.commons.EnumUtils; /** * 文件下载状态 * @author longgangbai * */ public enum DownloadStatus { Remote_File_Noexist(0,"远程文件不存在"), // 远程文件不存在 //用于单个下载 Download_New_Success(1,"下载文件成功"), // 下载文件成功 Download_New_Failed(2,"下载文件失败"), // 下载文件失败 Local_Bigger_Remote(3,"本地文件大于远程文件"), // 本地文件大于远程文件 Download_From_Break_Success(4,"文件断点续传成功"), // 断点续传成功 Download_From_Break_Failed(5,"文件断点续传失败"), // 断点续传失败 //用于批量下载 Download_Batch_Success(6,"文件批量下载成功"), Download_Batch_Failure(7,"文件批量下载失败"), Download_Batch_Failure_SUCCESS(8,"文件批量下载不完全成功"); private int code; private String description; private DownloadStatus(int code , String description) { this.code = code; this.description = description; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } /** * 下载状态中中使用的code * @param code * @return */ public static DownloadStatus fromCode(int code) { return EnumUtils.fromEnumProperty(DownloadStatus.class, "code", code); } }
package easyway.tbs.transfer.ftp; import easyway.tbs.commons.EnumUtils; /** * 文件上传状态 * @author longgangbai * */ public enum UploadStatus { Create_Directory_Fail(0,"远程服务器相应目录创建失败"), // 远程服务器相应目录创建失败 Create_Directory_Success(1,"远程服务器闯将目录成功"), // 远程服务器闯将目录成功 Upload_New_File_Success(2,"上传新文件成功"), // 上传新文件成功 Upload_New_File_Failed(3,"上传新文件失败"), // 上传新文件失败 File_Exits(4,"文件已经存在"), // 文件已经存在 Remote_Bigger_Local(5,"远程文件大于本地文件"), // 远程文件大于本地文件 Upload_From_Break_Success(6," 断点续传成功"), // 断点续传成功 Upload_From_Break_Failed(7,"断点续传失败"), // 断点续传失败 Delete_Remote_Faild(8,"删除远程文件失败"); // 删除远程文件失败 private int code; private String description; private UploadStatus(int code , String description) { this.code = code; this.description = description; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } /** * 下载状态中中使用的code * @param code * @return */ public static UploadStatus fromCode(int code) { return EnumUtils.fromEnumProperty(UploadStatus.class, "code", code); } }
package easyway.tbs.commons; import org.apache.commons.lang.ObjectUtils; import org.apache.log4j.Logger; /** * 枚举的工具类 * @author longgangbai * */ public abstract class EnumUtils { private static final Logger logger = Logger.getLogger(EnumUtils.class); /** * 从指定的枚举类中根据property搜寻匹配指定值的枚举实例 * @param <T> * @param enumClass * @param property * @param propValue * @return */ public static <T extends Enum<T>> T fromEnumProperty(Class<T> enumClass, String property, Object propValue) { T[] enumConstants = enumClass.getEnumConstants(); for (T t : enumConstants) { Object constantPropValue; try { constantPropValue = BeanUtils.getDeclaredFieldValue(t, property); if (ObjectUtils.equals(constantPropValue, propValue)) { return t; } } catch (Exception e) { logger.error(e.getMessage()); throw new RuntimeException(e); } } return null; } /** * 从指定的枚举类中根据名称匹配指定值 * @param <T> * @param enumClass * @param constantName * @return */ public static <T extends Enum<T>> T fromEnumConstantName(Class<T> enumClass, String constantName) { T[] enumConstants = enumClass.getEnumConstants(); for (T t : enumConstants) { if (((Enum<?>) t).name().equals(constantName)) { return t; } } return null; } }
package easyway.tbs.commons; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.Collection; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOCase; import org.apache.commons.io.IOUtils; import org.apache.commons.io.filefilter.FalseFileFilter; import org.apache.commons.io.filefilter.FileFilterUtils; import org.apache.commons.io.filefilter.IOFileFilter; import org.apache.log4j.Logger; /** * 文件操作工具类 * * @author longgangbai * */ public class FileOperateUtils { private static final Logger logger = Logger.getLogger(FileOperateUtils.class); /** * 查找需要合并文件的临时文件信息 * * @param directory * 临时文件所在的目录 * @param prefix * 临时文件的前缀 * @param caseSensitivity * 临时文件的大小写敏感 * @return */ public static Collection<File> searchPrefixFile(File directory,String prefix,boolean caseSensitivity){ IOCase iocase=IOCase.INSENSITIVE; if(caseSensitivity){ iocase=IOCase.SENSITIVE; } //创建相关的过滤器 IOFileFilter fileFilter=FileFilterUtils.prefixFileFilter(prefix, iocase); //检查相关的过滤信息 return FileUtils.listFiles(directory, fileFilter, FalseFileFilter.INSTANCE); } /** * 查找目录下特定后缀的文件 * @param directory * 特定的目录 * @param extensions * 临时文件的后缀扩展 * @param recursive * 是否查询临时文件所在的目录下的子目录 * @return */ public static Collection<File> searchExtensionFile(File directory,String[] extensions,boolean recursive){ return FileUtils.listFiles(directory, extensions, recursive); } /** * 文件追加功能 * @param lines * @param tmpFilePath */ public static void writeLinesToFile(Collection<String> lines,String tmpFilePath){ OutputStream output=null; try { output = new FileOutputStream(tmpFilePath,true); IOUtils.writeLines(lines, "UTF-8", output); } catch (Exception e) { logger.error(tmpFilePath+"追加文件失败"+e.getMessage()); } } }