平常整理的文件工具类,话不多说,直接上代码:
/**
* FileUtil.java
* Copyright ® 2011 窦海宁
* All right reserved
*/
package org.aiyu.core.common.util.file;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import org.aiyu.core.common.util.CollectionUtil;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.joda.time.DateTime;
/**
* <p>文件工具类
*
* <p>通用的文件工具类,可用于对文件进行一些常用的操作。
*
* @author 窦海宁, chong0660@sina.com
* @since AiyuCommonCore-1.0
* @version AiyuCommonCore-1.0
*/
public abstract class FileUtil {
/** 文件类型 */
public enum FileType {
FILE , //文件
DIRECTORY; //文件夹
}
//日志对象
private static final Logger logger = Logger.getLogger(FileUtil.class);
/**
* <p>创建临时文件路径名
*
* @param fileName 文件名
*
* @return 导出文件路径名
*
* @modify 窦海宁, 2014-05-04
*/
public static String createTempFileName(String fileName) {
String tempFileName = null;
if (StringUtils.isNotBlank(fileName)) {
File rootPathFile = new File("..\\temp\\");
try {
tempFileName = FilenameUtils.concat(rootPathFile.getCanonicalPath() , FileUtil.getDatePath(DateTime.now()));
FileUtils.forceMkdir(new File(tempFileName));
tempFileName = FilenameUtils.concat(tempFileName , FileUtil.getDateFileName(fileName , DateTime.now()));
} catch (IOException ex) {
ex.printStackTrace();
}
}
return tempFileName;
}
/**
* <p>获取指定时间对象对应的日期路径
*
* @param dateTime 时间对象
*
* @return 与指定时间对象对应的日期路径,如传入日期为2012年10月25日,则输出结果为2012\10\25
*
* @modify 窦海宁, 2014-05-07
*/
public static String getDatePath(DateTime dateTime) {
String dateTypeValue = null;
if (dateTime != null) {
dateTypeValue = FilenameUtils.concat(dateTime.toString("yyyy") , dateTime.toString("MM"));
dateTypeValue = FilenameUtils.concat(dateTypeValue , dateTime.toString("dd"));
}
return dateTypeValue;
}
/**
* <p>获取当前日期时间对象对应的文件名称(该方法仅在文件名末尾插入表示当前日期时间的字符串)
*
* @param fileName 文件名称
* @param dateTime 文件创建时间,用于避免文件名重复
*
* @return 与当前日期时间对象对应的文件名称,如文件名为D:\\Readme.doc、传入日期为2012年10月25日12点35分,则输出结果为Readme_20121025_1235.doc
*
* @modify 窦海宁, 2014-05-07
*/
public static String getDateFileName(String fileName , DateTime dateTime) {
String dateFileName = null;
if (fileName != null) {
String baseName = FilenameUtils.getBaseName(fileName);
String extName = FilenameUtils.getExtension(fileName);
dateFileName = baseName + "_" + dateTime.toString("yyyyMMdd_hhmm") + "." + extName;
}
return dateFileName;
}
/**
* <p>删除指定路径文件
*
* @param filePath 文件路径
*
* @modify 窦海宁, 2014-06-10
*/
public static void deleteFile(String filePath) {
if (StringUtils.isNotBlank(filePath)) {
File file = new File(filePath);
if (file.exists()) {
try {
FileUtils.forceDelete(file);
} catch (Exception ex) {
ex.printStackTrace();
}
} else {
FileUtil.logger.debug("FileUtil -> deleteFile : 与filePath对应的文件夹不存在");
}
} else {
FileUtil.logger.debug("FileUtil -> deleteFile : filePath is null!");
}
}
/**
* <p>从指定路径文件中加载参数对象
*
* @param filePath 文件路径
*
* @return 加载后的参数对象
*
* @modify 窦海宁, 2015-05-05
*/
public static Object loadObject(String filePath) throws Exception {
Object value = null;
if (StringUtils.isNotBlank(filePath)) {
//从文件系统读取文件
FileInputStream fileInputStream = null;
ObjectInputStream objectInputStream = null;
try {
fileInputStream = new FileInputStream(new File(filePath));
objectInputStream = new ObjectInputStream(fileInputStream);
value = objectInputStream.readObject();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
IOUtils.closeQuietly(objectInputStream);
IOUtils.closeQuietly(fileInputStream);
}
}
return value;
}
/**
* <p>将参数对象保存至指定路径文件
*
* @param object 参数对象
* @param directoryPath 文件路径
* @param filename 文件名
* @param appendDate 是否在文件名末尾追加日期
*
* @modify 窦海宁, 2012-10-30
*/
public static void saveObject(Object object , String directoryPath , String filename , boolean appendDate) throws Exception {
if (object != null && StringUtils.isNotBlank(directoryPath) && StringUtils.isNotBlank(filename)) {
//将对象保存到文件系统
FileUtils.forceMkdir(new File(directoryPath));
String filePath = null;
if (appendDate) {
filePath = FilenameUtils.concat(directoryPath , FileUtil.getDateFileName(filename , DateTime.now()));
}
filePath = FilenameUtils.concat(directoryPath , filename);
FileOutputStream fileOutputStream = null;
ObjectOutputStream objectOutputStream = null;
try {
fileOutputStream = new FileOutputStream(new File(filePath));
objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(object);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
IOUtils.closeQuietly(objectOutputStream);
IOUtils.closeQuietly(fileOutputStream);
}
}
}
/**
* <p>获取所有文件列表
*
* @param directoryFile 需要获取的文件列表所在的文件根路径对象
*
* @return 指定的文件根路径下的所有文件列表(包括子文件夹)
*
* @modify 窦海宁, 2016-01-05
*/
public static List getFileList(File directoryFile) {
return FileUtil.getFileList(directoryFile , false);
}
/**
* <p>获取所有文件列表
*
* @param directoryFile 需要获取的文件列表所在的文件根路径对象
* @param debug 是否输出调试信息
*
* @return 指定的文件根路径下的所有文件列表(包括子文件夹)
*
* @modify 窦海宁, 2016-01-05
*/
public static List getFileList(File directoryFile , boolean debug) {
return FileUtil.getFileList(directoryFile , FileType.FILE , false , debug);
}
/**
* <p>获取所有文件夹列表
*
* @param directoryFile 需要获取的文件夹列表所在的文件根路径对象
* @param isLastSubDirectory 是否只返回叶结点文件夹
*
* @return 指定的文件根路径下的所有文件夹列表(包括子文件夹)
*
* @modify 窦海宁, 2016-01-05
*/
public static List getDirectoryList(File directoryFile , boolean isLastSubDirectory) {
return FileUtil.getFileList(directoryFile , FileType.DIRECTORY , isLastSubDirectory , false);
}
/**
* <p>获取所有文件夹列表
*
* @param directoryFile 需要获取的文件夹列表所在的文件根路径对象
* @param isLastSubDirectory 是否只返回叶结点文件夹
* @param debug 是否输出调试信息
*
* @return 指定的文件根路径下的所有文件夹列表(包括子文件夹)
*
* @modify 窦海宁, 2016-01-05
*/
public static List getDirectoryList(File directoryFile , boolean isLastSubDirectory , boolean debug) {
return FileUtil.getFileList(directoryFile , FileType.DIRECTORY , isLastSubDirectory , debug);
}
/**
* <p>获取所有文件列表
*
* @param directoryFile 需要获取的文件列表所在的文件根路径对象
* @param fileType 文件类型
* @param isLastSubDirectory 是否只返回叶结点文件夹
* @param debug 是否输出调试信息
*
* @return 指定的文件根路径下的所有文件列表(包括子文件夹)
*
* @modify 窦海宁, 2014-02-03
*/
protected static List getFileList(File directoryFile , FileType fileType , boolean isLastSubDirectory , boolean debug) {
List fileList = new ArrayList();
if (directoryFile != null && directoryFile.exists()) {
File[] fileArray = directoryFile.listFiles();
for (int i = 0 ; i < fileArray.length ; i++) {
switch (fileType) {
case FILE :
if (fileArray[i].isDirectory()) {
//处理文件夹
fileList.addAll(FileUtil.getFileList(fileArray[i] , fileType , isLastSubDirectory , debug));
} else {
//处理文件
if (debug) {
try {
FileUtil.logger.debug("FileUtil -> getFileList : add file : " + fileArray[i].getCanonicalPath());
} catch (IOException ex) {
ex.printStackTrace();
}
}
fileList.add(fileArray[i]);
}
break;
case DIRECTORY :
if (fileArray[i].isDirectory()) {
//处理文件夹
List subDirectoryList = FileUtil.getFileList(fileArray[i] , fileType , isLastSubDirectory , debug);
if (isLastSubDirectory) {
if (CollectionUtil.isEmpty(subDirectoryList)) {
if (debug) {
try {
FileUtil.logger.debug("FileUtil -> getFileList : add directory : " + fileArray[i].getCanonicalPath());
} catch (IOException ex) {
ex.printStackTrace();
}
}
fileList.add(fileArray[i]);
}
} else {
if (debug) {
try {
FileUtil.logger.debug("FileUtil -> getFileList : add directory : " + fileArray[i].getCanonicalPath());
} catch (IOException ex) {
ex.printStackTrace();
}
}
fileList.add(fileArray[i]);
fileList.addAll(subDirectoryList);
}
}
break;
}
}
} else {
FileUtil.logger.debug("FileUtil -> getFileList : directoryFile is null!");
}
return fileList;
}
}