package message.utils;
import message.utils.exception.FileExistException;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* 文件操作的工具类
*
* @author sunhao(sunhao.java@gmail.com)
* @version V1.0
* @createTime 2012-3-16 下午08:25:56
*/
public class FileUtils {
private static final Logger logger = LoggerFactory.getLogger(FileUtils.class);
/**
* 系统文件分割符
*/
private static final String FILE_SEPARATOR = System.getProperty("file.separator");
/**
* 文件大小的单位
*/
private static final List<String> LIST_FILE_SIZE_UNIT = Arrays.asList(new String[]{"GB", "MB", "KB", "B"});
/**
* 构造器私有化
*/
private FileUtils(){
super();
}
/**
* 根据给定path创建文件夹
*
* @param path 给定路径
*/
public static void createFolder(String path){
if(StringUtils.isEmpty(path)){
logger.error("the given path is null!");
return;
}
if(logger.isDebugEnabled()){
logger.debug("given path is '{}'!", path);
}
File file = new File(path);
createFolder(file);
}
/**
* 根据给定file创建文件夹
*
* @param file 给定文件
*/
public static void createFolder(File file){
if(file.exists()){
logger.error("folder named '{}' is exist!", file.getName());
throw new FileExistException(10006, "'{}'文件夹已存在", file.getName());
} else {
try {
org.apache.commons.io.FileUtils.forceMkdir(file);
} catch (IOException e) {
logger.error("create folder '{}' error!", file.getName());
}
}
}
/**
* 删除文件夹
*
* @param folerName 文件名
* @param path 文件路径
* @return
*/
public static boolean deleteFolder(String folerName, String path){
return deleteFolder(folerName + path);
}
/**
* 删除文件夹
*
* @param filePath 路径名+文件名
* @return
*/
public static boolean deleteFolder(String filePath){
if(StringUtils.isEmpty(filePath)){
logger.error("given filePath '{}' is null!", filePath);
return false;
}
File file = new File(filePath);
if(!file.exists()){
logger.error("this file named '{}' is not exist!", file.getName());
return false;
}
return file.delete();
}
/**
* 创建文件
*
* @param path 文件路径
* @param file 文件字节流
*/
public static void createFile(String path, byte[] file){
FileOutputStream fos = null;
try {
fos = new FileOutputStream(path);
fos.write(file);
if(fos != null){
fos.close();
}
} catch (Exception e) {
logger.error("create file '{}' error!", path);
}
}
/**
* 重命名文件夹
*
* @param oldName 旧文件夹名
* @param newName 新文件夹名
* @param path 文件夹路径
* @return
*/
public static boolean renameFolder(String oldName, String newName, String path){
File oldFile = new File(path + FILE_SEPARATOR + oldName);
return oldFile.renameTo(new File(path + FILE_SEPARATOR + newName));
}
/**
* 如是是文件,删除;如是是文件夹,删除它和它下面的所有文件
*
* @param dirPath 文件夹路径
* @return
*/
public static boolean deleteFiles(String dirPath){
File file = new File(dirPath);
boolean success = Boolean.TRUE;
if(!file.isDirectory()){
//如果不是文件夹,而是文件,则直接删除
if(!file.delete()){
success = Boolean.FALSE;
}
return success;
}
String[] fileNames = file.list();
for(String fileName : fileNames){
if(!deleteFiles(dirPath + FILE_SEPARATOR + fileName)){
success = Boolean.FALSE;
}
}
if(!file.delete()){
success = Boolean.FALSE;
}
return success;
}
/**
* 获得文件的扩展名,如果是文件夹,返回null.没有扩展名,返回""
*
* @param file 要获取信息的文件
* @return
*/
public static String getFileExt(File file){
if(!file.isFile() || !file.exists()){
return StringUtils.EMPTY;
}
int i = file.getName().lastIndexOf(".");
if(i == -1){
return StringUtils.EMPTY;
}
return file.getName().substring(i);
}
/**
* 获得文件的扩展名,如果是文件夹,返回null.没有扩展名,返回""
*
* @param fileName 文件名
* @return
*/
public static String getFileExt(String fileName){
if(StringUtils.isEmpty(fileName)){
logger.error("given fileName '{}' is null!", fileName);
}
int i = fileName.lastIndexOf(".");
if(i == -1){
return StringUtils.EMPTY;
}
return fileName.substring(i);
}
/**
* 获取文件名(不包括扩展名)
*
* @param fileName 文件名
* @return
*/
public static String getFileName(String fileName){
if (StringUtils.isEmpty(fileName)) {
logger.error("given fileName '{}' is null!", fileName);
}
int i = fileName.lastIndexOf(".");
if (i == -1) {
return fileName;
}
return fileName.substring(0, i);
}
/**
* 获取文件名(不包括扩展名)
*
* @param file 要获取信息的文件
* @return
*/
public static String getFileName(File file) {
if (!file.isFile() || !file.exists()) {
return StringUtils.EMPTY;
}
return getFileName(file.getName());
}
/**
* 根据所给文件获取此文件的字节流
*
* @param file
* @return
* @throws Exception
*/
public static byte[] getFileByte(File file) throws Exception{
if(!file.exists() || !file.isFile() || !file.canRead()) {
logger.error("given path '{}' is not a file, maybe a folder! or it can not read!", file);
return null;
}
FileInputStream fis = openInputStream(file);
if(fis == null){
logger.error("the FileInputStream is null!");
}
return IOUtils.toByteArray(fis);
}
/**
* 根据所给路径获取此文件的字节流
*
* @param filePath
* @return
* @throws Exception
*/
public static byte[] getFileByte(String filePath) throws Exception {
if(StringUtils.isEmpty(filePath)){
logger.error("given filePath is null!");
return null;
}
File file = new File(filePath);
return getFileByte(file);
}
/**
* 根据所给文件获取此文件的字节流
*
* @param file
* @return
* @throws Exception
*/
public static char[] getFileChar(File file) throws Exception{
if(!file.exists() || !file.isFile() || !file.canRead()) {
logger.error("given path '{}' is not a file, maybe a folder! or it can not read!", file);
return null;
}
FileInputStream fis = openInputStream(file);
if(fis == null){
logger.error("the FileInputStream is null!");
}
return IOUtils.toCharArray(fis);
}
/**
* 根据所给路径获取此文件的字节流
*
* @param filePath
* @return
* @throws Exception
*/
public static char[] getFileChar(String filePath) throws Exception {
if(StringUtils.isEmpty(filePath)){
logger.error("given filePath is null!");
return null;
}
File file = new File(filePath);
return getFileChar(file);
}
/**
* 根据所给文件获取输入流
*
* @param file
* @return
* @throws Exception
*/
public static FileInputStream openInputStream(File file) throws Exception{
if (file.exists()) {
if (file.isDirectory() || !file.canRead()) {
throw new IOException("File '" + file + "' exists but is a directory");
}
if (file.canRead() == false) {
throw new IOException("File '" + file + "' cannot be read");
}
} else {
throw new FileNotFoundException("File '" + file + "' does not exist");
}
return new FileInputStream(file);
}
/**
* 根据所给路径获取输入流
*
* @param filePath
* @return
* @throws Exception
*/
public static FileInputStream openInputStream(String filePath) throws Exception{
if(StringUtils.isEmpty(filePath)){
logger.error("given filePath is null!");
return null;
}
File file = new File(filePath);
return openInputStream(file);
}
/**
* 获取单个文件的大小
*
* @param file 要取得文件的大小
* @return 文件大小,单位字节
*/
public static Long getFileSize(File file){
if(!file.exists() || file.isDirectory()) {
logger.warn("this file is not exists or it is not a file! file name is '{}'", file.getName());
return Long.valueOf(0);
}
return file.length();
}
/**
* 转换字符串型的文件大小为Long型的(结果是KB)
*
* @param size 字符串型的文件大小(单位MB.KB.B,不填默认为MB)
* @return byte为单位的大小
*/
public static Long converSizeToKB(String size){
Long sizeLong = Long.valueOf(0);
if(StringUtils.isEmpty(size)){
return sizeLong;
}
if(NumberUtils.isNumber(size))
return Long.valueOf(size);
boolean check = false;
for(String unit : LIST_FILE_SIZE_UNIT){
String reg = "[0-9.]{0,}(" + unit + ")$";
check = size.matches(reg);
if(check) break;
}
if(!check)
return sizeLong;
for(String unit : LIST_FILE_SIZE_UNIT){
String number = size.replaceAll(unit, "");
if(!NumberUtils.isNumber(number))
continue;
Long d = Long.valueOf(number);
if("GB".equals(unit)){
sizeLong = Long.valueOf(d * (1024 * 1024 * 1024));
} else if("MB".equals(unit)){
sizeLong = Long.valueOf(d * (1024 * 1024));
} else if("KB".equals(unit)){
sizeLong = Long.valueOf(d * 1024);
} else {
sizeLong = Long.valueOf(d);
}
break;
}
return sizeLong;
}
/**
* 获取单个文件的大小
*
* @param filePath 要取得文件的path
* @return 文件大小,单位字节
*/
public static Long getFileSize(String filePath){
if(StringUtils.isEmpty(filePath)){
logger.error("given file path is null");
return Long.valueOf(0);
}
File file = new File(filePath);
return getFileSize(file);
}
/**
* 获取文件夹的大小
*
* @param file 文件夹
* @return
*/
public static Long getDirectorySize(File file){
if(!file.exists()){
logger.warn("given file '{}' is null!", file);
return Long.valueOf(0);
}
Long size = 0L;
if(file.isDirectory()){
File files[] = file.listFiles();
for(int i = 0; i < files.length; i++){
if(files[i].isDirectory()){
size = size + getDirectorySize(files[i]);
} else {
size += getFileSize(files[i]);
}
}
} else {
size += file.length();
}
return size;
}
/**
* 获取文件夹的大小
*
* @param filePath 文件夹路径
* @return
*/
public static Long getDirectorySize(String filePath){
if(StringUtils.isEmpty(filePath)){
logger.error("given file path is null");
return Long.valueOf(-1);
}
File file = new File(filePath);
return getDirectorySize(file);
}
/**
* 遍历指定文件夹下的文件(可以指定扩展名)
*
* @param directory 文件夹
* @param extName 扩展名
* @return
*/
public static List<File> getFileUnderDirectory(String directory, String extName){
if(StringUtils.isEmpty(directory) || !new File(directory).exists()){
logger.error("given no path or not exist!");
return Collections.EMPTY_LIST;
}
List<File> files = new ArrayList<File>();
File file = new File(directory);
if(file.isDirectory()){
//是文件夹
File[] underFiles = file.listFiles(); //获取文件夹下所有的文件或者文件夹
for(File uf : underFiles){
if(!uf.isDirectory()){
logger.debug("scan file '{}'!", uf.getName());
addFileToList(files, uf, extName);
} else {
files.addAll(getFileUnderDirectory(uf.getAbsolutePath(), extName));
}
}
} else {
logger.debug("scan file '{}'!", file.getName());
addFileToList(files, file, extName);
}
return files;
}
/**
* 将给定的文件放入list中(按扩展名)
*
* @param files 放文件的list
* @param file 指定的文件
* @param extName 扩展名
*/
private static void addFileToList(List<File> files, File file, String extName){
if(StringUtils.isEmpty(extName)){
files.add(file);
} else if(StringUtils.isNotEmpty(extName) && file.getName().endsWith(extName)){
files.add(file);
} else {
//do nothing!
}
}
/**
* Reads the contents of a file into a String.
*
* @param filePath the file path to read, must not be <code>null</code>
* @param encoding the encoding to use, <code>null</code> means platform default
* @return
* @throws Exception
*/
public static String getFileText(String filePath, String encoding) throws Exception {
if (StringUtils.isEmpty(filePath)) {
logger.error("given filePath is null!");
return StringUtils.EMPTY;
}
return getFileText(new File(filePath), encoding);
}
/**
* Reads the contents of a file into a String.
*
* @param file the file to read, must not be <code>null</code>
* @param encoding the encoding to use, <code>null</code> means platform default
* @return
* @throws Exception
*/
public static String getFileText(File file, String encoding) {
InputStream in = null;
try {
in = openInputStream(file);
return IOUtils.toString(in, encoding);
} catch (IOException e) {
logger.error(e.getMessage(), e);
return StringUtils.EMPTY;
} catch (Exception e) {
logger.error(e.getMessage(), e);
return StringUtils.EMPTY;
} finally {
IOUtils.closeQuietly(in);
}
}
/**
* Reads the contents of a file line by line to a List of Strings.
* The file is always closed.
*
* @param file the file to read, must not be <code>null</code>
* @param encoding the encoding to use, <code>null</code> means platform default
* @return the list of Strings representing each line in the file, never <code>null</code>
* @throws Exception in case of an I/O error
* @throws java.io.UnsupportedEncodingException if the encoding is not supported by the VM
* @since Commons IO 1.1
*/
public static List<String> readLines(File file, String encoding) throws Exception {
return readLines(openInputStream(file), encoding);
}
/**
* Reads the contents of a file line by line to a List of Strings using the default encoding for the VM.
* The file is always closed.
*
* @param file the file to read, must not be <code>null</code>
* @return the list of Strings representing each line in the file, never <code>null</code>
* @throws Exception in case of an I/O error
* @since Commons IO 1.3
*/
public static List<String> readLines(File file) throws Exception {
return readLines(file, null);
}
/**
* Reads the contents of a file line by line to a List of Strings.
* The file is always closed.
*
* @param in the <code>InputStream</code> to read, must not be <code>null</code>
* @param encoding the encoding to use, <code>null</code> means platform default
* @return the list of Strings representing each line in the file, never <code>null</code>
* @throws Exception in case of an I/O error
* @throws java.io.UnsupportedEncodingException if the encoding is not supported by the VM
* @since Commons IO 1.1
*/
public static List<String> readLines(InputStream in, String encoding) throws Exception {
if(in == null)
return Collections.EMPTY_LIST;
return IOUtils.readLines(in, encoding);
}
/**
* Reads the contents of a file line by line to a List of Strings using the default encoding for the VM.
* The file is always closed.
*
* @param in the <code>InputStream</code> to read, must not be <code>null</code>
* @return the list of Strings representing each line in the file, never <code>null</code>
* @throws Exception in case of an I/O error
* @since Commons IO 1.3
*/
public static List<String> readLines(InputStream in) throws Exception {
return readLines(in, null);
}
}