基于JAVA的常用文件操作方法

平常整理的文件工具类,话不多说,直接上代码:

/**
 * 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  窦海宁, [email protected]
 * @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;
	}

}

猜你喜欢

转载自chong0660.iteye.com/blog/2367232