在软件开发中,文件处理是一个常见的任务,我们经常需要读取、写入和管理文件。为了更便捷地处理文件相关操作,我们编写了一个 FileUtils
工具类,提供了一些有用的文件处理方法。
FileUtils
工具类包含了一些常用的文件处理方法,主要功能如下:
现在让我们逐个介绍这些方法的实现细节。
public static String getFileName(String dir, String fileName, String yyyymmdd) {
// 实现代码...
}
这个方法根据文件名、目录和日期生成统一的文件路径。通过使用哈希算法对文件名进行处理,将文件保存到不同的目录下,避免重复保存和管理文件。
public static byte[] getBytesByBase64(String pythonBase64Code) {
// 实现代码...
}
该方法将 Base64 编码的字符串转换为字节数组,方便处理文件数据。这个方法在处理文件上传、下载等场景中非常有用。
public static String getFilePath(String pythonBase64Code, String savePath) {
// 实现代码...
}
getFilePath
方法根据 Base64 编码字符串和保存路径,将文件保存到指定位置,并返回文件路径。它通过文件的哈希值来确定文件保存的目录结构,提高文件的管理效率。
public static boolean writeByte(String filePath, byte[] data, boolean isAppend) {
// 实现代码...
}
public static boolean writeLines(List lines, String outPath, String filename) {
// 实现代码...
}
writeByte
方法用于将字节数组写入文件,支持追加或覆盖模式。writeLines
方法用于将字符串列表写入文件,支持逐行写入,非常适用于日志记录等场景。
为了更好地理解这些方法,下面我们给出了这些方法的详细实现。
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.util.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Objects;
public class FileUtils {
private static final Logger logger = LoggerFactory.getLogger(FileUtils.class);
public static final DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyyMMdd");
/**
* 获取统一的文件名
* @param dir 文件目录
* @param fileName 文件名
* @param yyyymmdd 年月日
* @return
*/
public static String getFileName(String dir,String fileName,String yyyymmdd){
int bucketID = (fileName.hashCode() & Integer.MAX_VALUE) % 100;
int secBucketID = (String.valueOf(fileName+"_"+bucketID).hashCode() & Integer.MAX_VALUE) % 100;
int sec2BucketID = (String.valueOf(fileName+"_"+bucketID+"_"+secBucketID).hashCode() & Integer.MAX_VALUE) % 100;
return dir + "/" + yyyymmdd + "/" + bucketID +"/" + secBucketID +"/"+ sec2BucketID +"/" + fileName;
}
public static byte[] getBytesByBase64(String pythonBase64Code){
if (StringUtils.isAllBlank(pythonBase64Code)){
return null;
}
pythonBase64Code = pythonBase64Code.replace("b'","").replace("'","").trim();
return Base64.decodeBase64(pythonBase64Code);
}
public static String getFilePath(String pythonBase64Code,String savePath){
if (StringUtils.isAllBlank(pythonBase64Code)){
return null;
}
if (StringUtils.isAllBlank(savePath)){
// 设置一个默认值,防止个别config文件没有设置对应的值
savePath = "/data/wisa/face";
}
byte[] bytes = getBytesByBase64(pythonBase64Code);
// 通过md5获取文件名 避免重复保存
String filename = MD5Util.createMd5(new String(bytes))+".jpg";
String resultPath = getFileName(savePath,filename, LocalDateTime.now().format(format));
File file = new File(resultPath);
boolean res = true;
if (!file.exists()){
file.getParentFile().mkdirs();
res = writeByte(file.getPath(), bytes, false);
}else {
logger.info("image file exist, file path is {}",file.getPath());
}
if (res){
logger.info("file path is {}",file.getPath());
return file.getPath();
}
return null;
}
/**
* 写入byte文件操作
* @param filePath 文件路径
* @param data 写入字节数组
* @param isAppend 写入文件时,是追加还是从头开始,false:从头写入 true:追加
*/
public static boolean writeByte(String filePath, byte[] data, boolean isAppend) {
boolean result = true;
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(filePath, isAppend);
outputStream.write(data);
outputStream.flush();
} catch (IOException e) {
logger.error("file write failed",e);
result = false;
e.printStackTrace();
}finally {
try{
if (outputStream != null){
outputStream.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
return result;
}
public static boolean writeLines(List lines,String outPath,String filename){
boolean result = false;
if (Objects.isNull(lines) || lines.isEmpty()){
return false;
}
//将每次计算的结果写入到文件最后一行,而不是覆盖
File file = new File(outPath);
if (!file.exists()){
file.mkdirs();
}
File outFile = new File(outPath + "/" + filename);
try(BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile,true)))){
StringBuffer stringBuffer = new StringBuffer();
for (String line : lines) {
stringBuffer.append(line).append("\n");
}
bw.write(stringBuffer.toString());
result = true;
}catch(Exception e) {
e.printStackTrace();
}
return result;
}
}
通过 FileUtils
工具类,我们提供了一些方便的文件处理方法,可以帮助开发者更高效地进行文件操作。这些方法适用于各种场景,例如文件存储、文件处理等,希望本文对文件处理工具类的使用有所帮助!