FileUtils工具类
文件上传、文件下載、讀寫文件、解压文件
import com.alibaba.fastjson.JSON;import com.example.demo.util.DateUtil;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public enum FileUtils {
private static final Logger logger = LoggerFactory.getLogger(FileUtils.class);
/**
* 创建文件夹
* @param folderName
* @return
*/
public static boolean createFolder(String folderName) {
boolean result = Boolean.FALSE;
File file = new File(folderName);
//如果文件夹不存在则创建
if (!file.exists()) {
logger.info("文件夹路径不存在,创建路径:{}", folderName);
if (file.mkdirs()) {
logger.info("创建路径成功:{}", folderName);
}
}
logger.info("文件夹路径:{}", folderName);
return result;
}
/**
* 生成文件
*
* @param fileContent 生成文件中的内容
* @param saveFilePath 生成文件保存路径
* @param fileName 生成的文件名
* @return 生成文件是否成功
*/
public static boolean create(String fileContent, String saveFilePath, String fileName) {
logger.info("生成文件操作,fileContent:{},saveFilePath:{},fileName:{}", fileContent, saveFilePath, fileName);
long dateTimeStart = System.currentTimeMillis();
boolean result = Boolean.FALSE;
//生成文件保存路径
String urlPath = saveFilePath + File.separatorChar + fileName;
InputStream is = null;
BufferedReader br = null;
BufferedWriter bufferedWriter = null;
InputStreamReader isr = null;
FileOutputStream fos = null;
OutputStreamWriter osw = null;
try {
File file = new File(saveFilePath);
//如果文件夹不存在则创建
if (!file.exists()) {
logger.info("文件保存路径不存在,创建保存路径:{}", saveFilePath);
if (file.mkdirs()) {
logger.info("文件保存路径生成成功:{}", saveFilePath);
}
}
logger.info("文件访问路径:{}", urlPath);
StringBuilder buffer = new StringBuilder();
is = new ByteArrayInputStream(fileContent.getBytes("UTF-8"));
isr = new InputStreamReader(is, "UTF-8");
br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
buffer.append(line).append("
");
}
fos = new FileOutputStream(urlPath);
osw = new OutputStreamWriter(fos,"UTF-8");
bufferedWriter = new BufferedWriter(osw);
bufferedWriter.write(buffer.toString());
bufferedWriter.newLine();
bufferedWriter.flush();
result = Boolean.TRUE;
} catch (Exception e) {
logger.error("生成文件异常", e);
} finally {
try {
if (null != is) is.close();
if (null != isr) isr.close();
if (null != fos) fos.close();
if (null != osw) osw.close();
if (null != br) br.close();
if (null != bufferedWriter) bufferedWriter.close();
} catch (Exception e) {
logger.error("释放文件流异常", e);
}
}
logger.info("生成文件耗时:{}", System.currentTimeMillis() - dateTimeStart);
return result;
}
/**
* 压缩文件
*
* @param sourceFilePath :待压缩的文件路径
* @param zipFilePath :压缩后存放路径
* @param saveFileName :压缩后文件的名称
* @return
*/
public static Boolean zipFile(String sourceFilePath , String zipFilePath, String saveFileName) {
ZipOutputStream out = null;
FileInputStream in = null;
Boolean result = Boolean.FALSE;
try {
File sourceFile = new File(sourceFilePath);
if (sourceFile.isFile()){
String sourcePath = sourceFile.getParent();
zipFilePath = StringUtils.isEmpty(zipFilePath)? sourcePath: zipFilePath;
File destZipFile = new File(zipFilePath + File.separatorChar + saveFileName + ".zip");
out = new ZipOutputStream(new FileOutputStream(destZipFile));
byte[] buf = new byte[1024 * 10];
in = new FileInputStream(sourceFile);
out.putNextEntry(new ZipEntry(sourceFile.getName()));
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
result = Boolean.TRUE;
}
}catch(Exception e) {
logger.error("压缩文件异常", e);
}finally {
try {
if (out != null) out.close();
if (in != null) in.close();
} catch (IOException e) {
logger.error("压缩文件关闭流异常", e);
}
}
return result;
}
/**
* 压缩文件或文件夹
* @param srcPath
* @param destPath
* @param password
*/
private static void zipFileWithPwd(String srcPath,String destPath,String password) {
try {
// 生成的压缩文件
ZipFile zipFile = new ZipFile(destPath);
ZipParameters parameters = new ZipParameters();
// 压缩方式
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
// 压缩级别
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
parameters.setEncryptFiles( true );
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
if (!StringUtils.isEmpty(password)){
parameters.setPassword(password);
}
// 要打包的文件夹
File srcFile = new File(srcPath);
if (srcFile.isDirectory()) {
File[] fs = srcFile.listFiles();
// 遍历t文件夹下所有的文件、文件夹
if (fs != null && fs.length > 0) {
for (File f : fs) {
if (f.isDirectory()) {
zipFile.addFolder(f.getPath(), parameters);
} else {
zipFile.addFile(f, parameters);
}
}
}
} else {
zipFile.addFile(srcFile, parameters);
}
}catch (Exception e){
logger.error("压缩文件异常", e);
}
}
/**
* 解压缩文件
* @param srcPath
* @param destPath
* @param password
*/
private static void unZip(String srcPath,String destPath,String password) {
try {
ZipFile zipFile = new ZipFile(srcPath);
zipFile.extractAll(destPath);
// 如果解压需要密码
if(zipFile.isEncrypted()) {
if (!StringUtils.isEmpty(password)){
zipFile.setPassword(password);
}
}
} catch (ZipException e) {
logger.error("解压缩文件异常", e);
}
}
/**
* 删除单个文件
*
* @param fileName 要删除的文件的文件名
* @return 单个文件删除成功返回true,否则返回false
*/
public static boolean deleteFile(String fileName) {
boolean result = Boolean.FALSE;
try {
File file = new File(fileName);
// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
if (file.exists() && file.isFile()) {
if (file.delete()) {
logger.info("删除单个文件" + fileName + " 成功!");
result = Boolean.TRUE;
} else {
logger.error("删除单个文件" + fileName + " 失败!");
}
} else {
logger.error("删除单个文件失败:" + fileName + " 不存在!");
}
}catch (Exception e){
logger.error("删除单个文件" + fileName + " 异常!");
}
return result;
}
/**
* 删除beforDay天前的文件
* @param fileName
* @param beforDay 天
* @return
*/
public static boolean deleteFile(String fileName,int beforDay) {
boolean result = Boolean.FALSE;
Date nowTime = new Date();
try {
Date fileModifiedTime = getFileModifiedTime(fileName);
long betweenDate = DateUtil.getOffsetBetweenDate(nowTime, fileModifiedTime, "d");
if (betweenDate >= Long.parseLong(String.valueOf(beforDay))){
deleteFile(fileName);
}
}catch (Exception e){
logger.error("删除单个文件" + fileName + " 异常!");
}
return result;
}
/**
* 获取文件修改时间
* @param fileName
* @return
*/
public static Date getFileModifiedTime(String fileName){
File file = new File(fileName);
if (null == file)
return null;
Calendar cal = Calendar.getInstance();
long time = file.lastModified();
cal.setTimeInMillis(time);
logger.info("FileUtils --> getFileModifiedTime: {}", JSON.toJSONString(cal.getTime()));
return cal.getTime();
}
/**
* 上传文件
*
* 用于读面向行的格式化大文件
* @param inputFile 来源路径
* @param outputFile 上传路径
*/
public static String upload(String inputFile, String outputFile) {
logger.info("上传文件,inputFile:{},outputFile:{}", inputFile, outputFile);
long dateTimeStart = System.currentTimeMillis();
boolean result = Boolean.FALSE;
FileInputStream fis = null;
BufferedInputStream bis = null;
InputStreamReader isr = null;
BufferedReader in = null;
FileWriter fw = null;
try {
File srcfile = new File(inputFile);
File file = new File(outputFile);
//如果文件夹不存在则创建
if (!file.exists()) {
logger.info("文件保存路径不存在,创建保存路径:{}", outputFile);
if (file.mkdirs()) {
logger.info("文件保存路径生成成功:{}", outputFile);
}
}
fis = new FileInputStream(srcfile);
bis = new BufferedInputStream(fis);
isr = new InputStreamReader(bis, "utf-8");
in = new BufferedReader(isr, 10 * 1024 * 1024);//10M
outputFile = outputFile + File.separatorChar + srcfile.getName();
fw = new FileWriter(outputFile);
String line = null;
while (in.ready()) {
line = in.readLine();
fw.append(line).append("
");
}
fw.flush();
result = Boolean.TRUE;
} catch (IOException e) {
logger.error("上传文件异常", e);
} finally {
try {
if (fis != null) fis.close();
if (bis != null) bis.close();
if (isr != null) isr.close();
if (in != null) in.close();
if (fw != null) fw.close();
} catch (Exception e) {
logger.error("上传文件关闭文件流异常", e);
}
}
logger.info("上传文件:{}", System.currentTimeMillis() - dateTimeStart);
return result? outputFile : null;
}
/**
* 读取文件内容
* 读客户端大文件
* @return
*/
public static List<String> read(MultipartFile file) {
List<String> resultList = null;
InputStream is = null;
BufferedInputStream bis = null;
InputStreamReader isr = null;
BufferedReader in = null;
try {
is = file.getInputStream();
bis = new BufferedInputStream(is);
isr = new InputStreamReader(bis, "utf-8");
in = new BufferedReader(isr, 10 * 1024 * 1024);//10M
resultList = new ArrayList<>();
while (in.ready()) {
resultList.add(in.readLine());
}
}catch (Exception e){
logger.error("读取文件异常", e);
} finally {
try {
if (is != null) is.close();
if (bis != null) bis.close();
if (isr != null) isr.close();
if (in != null) in.close();
} catch (IOException e) {
logger.error("读取文件关闭文件流异常", e);
}
}
return resultList;
}
/**
* 读取文件内容
* 读服务器端大文件
* @param fileName 来源路径
*/
public static List<String> read(String fileName) {
logger.info("读出文件内容操作,文件路径:{}", fileName);
long dateTimeStart = System.currentTimeMillis();
List<String> resultList = null;
FileInputStream fis = null;
BufferedInputStream bis = null;
InputStreamReader isr = null;
BufferedReader in = null;
try {
File file = new File(fileName);
if (!file.exists()) {
logger.info("读出文件不存在,文件路径:{}", fileName);
return resultList;
}
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
isr = new InputStreamReader(bis, "utf-8");
in = new BufferedReader(isr, 10 * 1024 * 1024);//10M
resultList = new ArrayList<>();
while (in.ready()) {
resultList.add(in.readLine());
}
} catch (IOException e) {
logger.error("读取文件异常", e);
}finally {
try {
if (in != null) in.close();
if (fis != null) fis.close();
if (bis != null) bis.close();
if (isr != null) isr.close();
} catch (IOException e) {
logger.error("读取文件关闭文件流异常", e);
}
}
logger.info("读出文件内容耗时:{}", System.currentTimeMillis() - dateTimeStart);
return resultList;
}
/**
* 判断字符串中是否包含中文
* @param str
* 待校验字符串
* @return 是否为中文
* @warn 不能校验是否为中文标点符号
*/
public static boolean isContainChinese(String str) {
Pattern p = Pattern.compile("[u4e00-u9fa5]");
Matcher m = p.matcher(str);
if (m.find()) {
return true;
}
return false;
}
/**
* 文件大小
*
* @param :multipartFile:上传的文件
* @param unit:限制单位(B,K,M,G)
* @return 文件大小
*/
public static double checkFileSize(MultipartFile multipartFile,String unit) {
long len = multipartFile.getSize();//上传文件的大小, 单位为字节.
//准备接收换算后文件大小的容器
double fileSize = 0.0d;
if ("B".equals(unit.toUpperCase())) {
fileSize = (double) len;
} else if ("K".equals(unit.toUpperCase()) || "KB".equals(unit.toUpperCase())) {
fileSize = (double) len / 1024;
} else if ("M".equals(unit.toUpperCase()) || "MB".equals(unit.toUpperCase())) {
fileSize = (double) len / 1048576;
} else if ("G".equals(unit.toUpperCase()) || "GB".equals(unit.toUpperCase())) {
fileSize = (double) len / 1073741824;
}
return fileSize;
}
/**
* 判断文件大小
*
* @param :multipartFile:上传的文件
* @param sizeLimit: 限制大小
* @param unit:限制单位(B,K,M,G)
* @return boolean:是否大于
*/
public static boolean fileIsTooBig(MultipartFile multipartFile, int sizeLimit, String unit) {
//准备接收换算后文件大小的容器
double fileSize = checkFileSize(multipartFile, unit);
//如果上传文件大于限定的容量
if (fileSize > sizeLimit) {
return true;
}
return false;
}
public static String getProjRoot() {
return System.getProperty("emp.dir");
}
}
以上是 FileUtils工具类 的全部内容, 来源链接: utcz.com/z/512546.html