Java获取文件类型,FileTypeUtil、Files、MimetypesFileTypeMap、URL多种实现对比

说说需求:

工作中需要判断文件是否是音频文件,实际生产环境中,遇到用户修改文件后缀的情况,导致逻辑处理异常。

正确获取到文件的类型是核心工作了,以下是实现的方案:

  1. hutool的FileTypeUtil
  2. JDK的Files
  3. JDK的MimetypesFileTypeMap
  4. JDK的URL
  5. guava的Files

引入依赖:

xml 复制代码
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
	<version>5.7.17</version>
</dependency>

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>33.1.0-jre</version>
</dependency>

代码实现:

java 复制代码
public class FileTypeUtils {
    protected final static MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap();
    public static void main(String[] args) throws IOException {
        List<File> files = Arrays.asList(
                new File("E:\\GPT-SoVITS\\demo\\ambor\\原音频.wav"),
                new File("E:\\GPT-SoVITS\\demo\\ambor\\原音频(修改后缀).mp3"),
                new File("E:\\GPT-SoVITS\\demo\\ambor\\3925干音_响度归一化.mp3"));
        for (File file : files) {
            System.out.println(file.getName()+"\n\tgetFileTypeByHuTool:\t"+
                    getFileTypeByHuTool(file)+"\n\tgetFileTypeByJdkFiles:\t"+
                    getFileTypeByJdkFiles(file)+"\n\tgetFileTypeByJdkMimetypesFileTypeMap:\t"+
                    getFileTypeByJdkMimetypesFileTypeMap(file)+"\n\tgetFileTypeByJdkURLs:\t"+
                    getFileTypeByJdkURLs(file)+"\n\tgetFileTypeByGuavaFiles:\t"+
                    getFileTypeByGuavaFiles(file)+"\n\t");
        }

    }

    protected static String getFileTypeByHuTool(File file){
        return FileTypeUtil.getType(file);
    }

    protected static String getFileTypeByJdkFiles(File file) throws IOException {
        return Files.probeContentType(file.toPath());
    }

    protected static String getFileTypeByJdkMimetypesFileTypeMap(File file) {
        return fileTypeMap.getContentType(file);
    }

    protected static String getFileTypeByJdkURLs(File file) throws IOException {
        URLConnection conn = file.toURL().openConnection();
        return conn.getContentType();
    }

    protected static String getFileTypeByGuavaFiles(File file) throws IOException {
        return com.google.common.io.Files.getFileExtension(file.getPath());
    }
}

输出结果:

  • ×标识的为识别失败。
原音频.wav 原音频(修改后缀).mp3 3925干音_响度归一化.mp3
getFileTypeByHuToolwav wav mp3 × mp3
getFileTypeByJdkFiles audio/wav audio/mpeg × audio/mpeg
getFileTypeByJdkMimetypesFileTypeMap audio/x-wav audio/mpeg × audio/mpeg
getFileTypeByJdkURLs audio/x-wav audio/x-wav content/unknown ×
getFileTypeByGuavaFiles wav mp3 × mp3

结论:

优先使用JDK URL的检测方式,再使用JDK Files方式,优点是无需引入额外的依赖包,也能保证正确性。

相关推荐
桦说编程7 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen7 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研7 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
没有bug.的程序员8 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋8 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
阿华的代码王国8 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~8 小时前
《设计模式》装饰模式
java·设计模式
A尘埃8 小时前
企业级Java项目和大模型结合场景(智能客服系统:电商、金融、政务、企业)
java·金融·政务·智能客服系统
青云交9 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图
CHEN5_029 小时前
【Java基础面试题】Java基础概念
java·开发语言