package com.demo.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
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.io.Serializable;
import java.nio.channels.FileChannel;
import java.text.DecimalFormat;
import java.util.UUID;
import java.util.zip.GZIPOutputStream;
public class FileUtils {
/**
* 格式化文件大小,根据文件大小不同使用不同单位
* @param size 文件大小
* @return 字符串形式的大小,包含单位(B,KB,MB,GB,TB,PB)
*/
public static String formatFileSize(long size) {
DecimalFormat formater = new DecimalFormat("####.00");
if (size < 1024L) {
return size + "B";
} else if (size < 1048576L) {
return formater.format(size / 1024f) + "KB";
} else if (size < 1073741824L) {
return formater.format(size / 1048576f) + "MB";
} else if (size < 1099511627776L) {
return formater.format(size / 1073741824f) + "GB";
} else if (size < 1125899906842624L) {
return formater.format(size / 1099511627776f) + "TB";
} else if (size < 1152921504606846976L) {
return formater.format(size / 1125899906842624f) + "PB";
}
return "size: out of range";
}
/**
* 从路径中获取文件名,包含扩展名
* @param path 路径
* @return 如果所传参数是合法路径,截取文件名,如果不是返回原值
*/
public static String getFileName(String path) {
if (path != null && (path.contains("/")||path.contains("\\"))) {
String fileName = path.trim();
int beginIndex;
if ((beginIndex=fileName.lastIndexOf("\\")) != -1) {
fileName = fileName.substring(beginIndex+1);
}
if ((beginIndex=fileName.lastIndexOf("/")) != -1) {
fileName = fileName.substring(beginIndex+1);
}
return fileName;
}
return path;
}
/**
* 从路径中获取文件名,不包含扩展名
* @param path 路径
* @return 如果所传参数是合法路径,截取文件名,如果不是返回原值
*/
public static String getFileNameWithoutSuffix(String path) {
if (path != null && (path.contains("/")||path.contains("\\"))) {
String fileName = path.trim();
int beginIndex;
if ((beginIndex=fileName.lastIndexOf("\\")) != -1) {
fileName = fileName.substring(beginIndex+1);
}
if ((beginIndex=fileName.lastIndexOf("/")) != -1) {
fileName = fileName.substring(beginIndex+1);
}
return deleteSuffix(fileName);
}
return deleteSuffix(path);
}
/**
* 获取扩展名
* @param s 路径或后缀
* @return 不存在后缀时返回null
*/
public static String getSuffix(String s) {
if (s.contains(".")) {
return s.substring(s.lastIndexOf("."));
}
return null;
}
/**
* 返回去掉扩展名的文件名
*/
public static String deleteSuffix(String fileName) {
if (fileName.contains(".")) {
fileName = fileName.substring(0, fileName.lastIndexOf("."));
}
return fileName;
}
/**
* 检查是否有同名文件,有则在自动在文件名后加当前时间的毫秒值
*/
public static File checkAndRename(File target) {
if (target.exists()) {
String fileName = target.getName();
if (fileName.contains(".")) {
String sub = fileName.substring(0, fileName.lastIndexOf("."));
fileName = fileName.replace(sub, sub + "_" + System.currentTimeMillis());
} else {
fileName = fileName+"_"+ System.currentTimeMillis();
}
return new File(target.getParent(), fileName);
}
return target;
}
/**
* 移动文件或文件夹
* @param src 要移动的文件或文件夹
* @param target 目标文件或文件夹。类型需与源相同,如源为文件,则目标也必须是文件
* @param replace 当有重名文件时是否替换。传false时,自动在原文件名后加上当前时间的毫秒值
* @return 移动成功返回true,否则返回false
*/
public static boolean moveFile(File src, File target, boolean replace) {
if (src == null || !src.exists() || target == null) {
return false;
}
if (!replace) {
target = checkAndRename(target);
}
copy(src, target);
return compareAndDeleteSrc(src, target);
}
private static boolean compareAndDeleteSrc(File src, File target) {
//如果文件存在,并且大小与源文件相等,则写入成功,删除源文件
if (src.isFile()) {
if (target.exists() && target.length() == src.length()) {
src.delete();
return true;
}
} else {
if (getDirSize(src) == getDirSize(target)) {
deleteDir(src, true);
return true;
}
}
return false;
}
/**
* 移动文件或文件夹
* @param src 要移动的文件或文件夹
* @param target 目标文件或文件夹。类型需与源相同,如源为文件,则目标也必须是文件
* @param replace 当有重名文件时是否替换。传false时,自动在原文件名后加上当前时间的毫秒值
* @return 移动成功返回true,否则返回false
*/
public static boolean moveFileFit(File src, File target, boolean replace) {
if (src == null || !src.exists() || target == null) {
return false;
}
if (!replace) {
target = checkAndRename(target);
}
copyFit(src, target);
//如果文件存在,并且大小与源文件相等,则写入成功,删除源文件
return compareAndDeleteSrc(src, target);
}
/**
* 去掉字符串中重复部分字符串
* @param dup 重复部分字符串
* @param strs 要去重的字符串
* @return 按参数先后顺序返回一个字符串数组
*/
public static String[] removeDuplicate(String dup, String... strs) {
for (int i = 0; i < strs.length; i++) {
if (strs[i] != null) {
strs[i] = strs[i].replaceAll(dup+"+", "");
}
}
return strs;
}
/**
* 获取随机UUID文件名
* @param fileName 原文件名
* @return 生成的文件名
*/
public static String generateRandonFileName(String fileName) {
// 获得扩展名
int beginIndex = fileName.lastIndexOf(".");
String ext = "";
if (beginIndex != -1) {
ext = fileName.substring(beginIndex);
}
return UUID.randomUUID().toString() + ext;
}
/**
* 删除文件夹
* @param dir 文件夹
* @param includeSelf 是否包括本身
*/
public static void deleteDir(File dir, boolean includeSelf) {
File[] files = dir.listFiles();
if (files != null) {
for (File f : files) {
if (f.isDirectory()) {
deleteDir(f, true);
} else {
f.delete();
}
}
}
if (includeSelf)
dir.delete();
}
/**
* 删除文件内所有文件,不包�