Java 文件处理工具类详解

在软件开发中,文件处理是一个常见的任务,我们经常需要读取、写入和管理文件。为了更便捷地处理文件相关操作,我们编写了一个 FileUtils 工具类,提供了一些有用的文件处理方法。

工具类介绍

FileUtils 工具类包含了一些常用的文件处理方法,主要功能如下:

  • 获取统一的文件名
  • Base64 编码处理
  • 获取文件路径
  • 写入文件

现在让我们逐个介绍这些方法的实现细节。

获取统一的文件名

public static String getFileName(String dir, String fileName, String yyyymmdd) {
    // 实现代码...
}

这个方法根据文件名、目录和日期生成统一的文件路径。通过使用哈希算法对文件名进行处理,将文件保存到不同的目录下,避免重复保存和管理文件。

Base64 编码处理

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 工具类,我们提供了一些方便的文件处理方法,可以帮助开发者更高效地进行文件操作。这些方法适用于各种场景,例如文件存储、文件处理等,希望本文对文件处理工具类的使用有所帮助!

你可能感兴趣的:(工具类,web项目,java,开发语言)