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

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

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

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

引入依赖:

<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>

代码实现:

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原音频(修改后缀).mp33925干音_响度归一化.mp3
getFileTypeByHuToolwavwavmp3 ×mp3
getFileTypeByJdkFilesaudio/wavaudio/mpeg ×audio/mpeg
getFileTypeByJdkMimetypesFileTypeMapaudio/x-wavaudio/mpeg ×audio/mpeg
getFileTypeByJdkURLsaudio/x-wavaudio/x-wavcontent/unknown ×
getFileTypeByGuavaFileswavmp3 ×mp3

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/584617.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】抽象工厂模式(Abstract Factory Pattern)

目录标题 抽象工厂设计模式详解1. 介绍2. 结构3. 实现步骤3.1 创建抽象产品接口3.2 创建具体产品类3.3 创建抽象工厂接口3.4 创建具体工厂类 4. 好处与优点5. 坏处与缺点6. 适用场景7. 总结 抽象工厂设计模式详解 1. 介绍 抽象工厂模式是一种创建型设计模式&#xff0c;它提供…

Kimichat使用技巧:方便又实用的kimi+智能体

今天kimi智能助手推出了kimi的功能。简单的说&#xff0c;就是一系列kimi已经写好的提示词&#xff0c;用户可以直接调用、对话。 Kimi分为官方推荐、办公提效、辅助写作、社交娱乐、生活实用这几类。可以从左边侧边栏点击进入。 官方推荐的有&#xff1a; Kimi 001号小客服&…

c语言——二叉树

目录 目录 二叉树关键概念理解 一颗拥有1000个结点的树度为4&#xff0c;则它的最小深度是&#xff1f; 那么对于二叉树&#xff0c;只掌握这些是远远不够的&#xff0c;我们还需要掌握几个最基本的经典问题&#xff0c; 求二叉树大小 求叶子结点个数 求深度 求第k层的…

多线程编程9——线程池

一、为什么要引入线程池&#xff1f; 虽然对比进程&#xff0c;线程已经很轻量了&#xff0c;创建销毁调度线程都更高效。但是随着并发程度的提高&#xff0c;我们对于性能要求的标准也越来越高&#xff0c;当我们需要频繁创建销毁调度线程时&#xff0c;就发现线程也没有那么…

【基础算法】二分查找

1.二分查找 二分查找 思路&#xff1a; 朴素二分模版 class Solution { public:int search(vector<int>& nums, int target) {int l 0, r nums.size() - 1;while(l < r){int mid (l r) / 2;if(nums[mid] < target) l mid 1;else if(nums[mid] > ta…

综合性练习(后端代码练习1)——加法计算器

目录 一、准备工作 二、约定前后端交互接口 1、概念介绍 2、需求分析 3、接口定义 请求参数 响应数据 三、服务器代码 四、前端页面代码 五、运行测试 遇到问题如何解决&#xff1f; 需求&#xff1a;输入两个整数&#xff0c;点击 “点击相加” 按钮&#xff0c;显…

JAVA顺序表相关习题1

1.笔试题:cvte str1 :welcome to cvte str2:come 描述:删除第一个字符串当中出现的所有的第二个字符串的字符!结果:wlt vt 要求 用ArrayList完成! public class Test {public static List<Character> findSameWords(String u1, String u2){List<Character> listn…

前端请求没问题,后端正常运行,但查不出数据

写代码时写得快了些&#xff0c;Orders.的订单状态写错了CONFIRMED 改成COMPLETED

二、再识VUE-MVVM

一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 MVVM Vue.js 专注于 MVVM 模型的 ViewModel 层。它通过双向数据绑定把 View 层和 Model 层连接了起来。实际的 DOM 封装和输出格式都被抽象为了 Directives 和 Filters。 ViewModel 一个同步 Model 和 View 的对象。在 Vue.js…

汇川AM400PLC编码器转速测量功能块(M法测速)

M法测速的原理和相关代码,大家可以参考相关专栏文章,常用链接如下: 1、编码器M法测速仿真 编码器M法测速仿真(Simulink)_mt法测速 simulink-CSDN博客文章浏览阅读2k次。编码器M法和T法测速的详细讲解可以参看下面的文章链接,这里不再赘述,这里主要介绍Simulink里建模仿真…

(06)vite与ts的结合

文章目录 系列全集package.json在根目录创建 tsconfig.json 文件在根目录创建 vite.config.ts 文件index.html额外的类型声明 系列全集 &#xff08;01&#xff09;vite 从启动服务器开始 &#xff08;02&#xff09;vite环境变量配置 &#xff08;03&#xff09;vite 处理 c…

详细介绍如何使用YOLOv9 在医疗数据集上进行实例分割-含源码+数据集下载

深度学习彻底改变了医学图像分析。通过识别医学图像中的复杂模式,它可以帮助我们解释有关生物系统的重要见解。因此,如果您希望利用深度学习进行医疗诊断,本文可以成为在医疗数据集上微调YOLOv9 实例分割的良好起点。 实例分割模型不是简单地将区域分类为属于特定细胞类型,…

新质生产力实践,我用chatgpt开发网站

是的&#xff0c;我用chatgpt开发了一个网站&#xff0c;很轻松。 我之前一点不懂前端&#xff0c;也没有网站开发的代码基础&#xff0c;纯正的0基础。 从0开始到最后成品上线&#xff0c;时间总计起来大致一共花了2-3周的时间。 初始想法我是想给我公司开发一个网站&#…

3月8日是星期六

突然有查询特殊条件日期的需求。 <html> <title>3月8日是星期六</title> <center> <h1 id"h1"></h1> <div id"div"></div> </center> <script> var weekday [星期日, 星期一, 星期二, 星期…

Eclipse:-Dmaven.multiModuleProjectDirectory system propery is not set.

eclipse中使用maven插件的时候&#xff0c;运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match. 可以设一个环境变量M2_HOME指向你的maven安装目录 M2_HOMED:\Apps\…

echarts开发技巧

tooltip 提示框组件相关的行为&#xff0c;必须引入提示框组件后才能使用。 tooltip: {trigger: axis,axisPointer: {type: cross,label: {backgroundColor: #6a7985,},},//为弹出层的value值增加百分号valueFormatter: function (value) {return value %}, }, tooltip.axi…

碳课堂|快速了解标准要点:ISO 14064-1

为了提高企业组织碳排放报告信誉度&#xff0c;国际标准化组织&#xff08;ISO&#xff09;发布了ISO14064 标准&#xff08;全称&#xff1a;《ISO 14064-1组织层次上对温室气体排放和清除的量化和报告的规范及指南》&#xff09;&#xff0c;报告中详细规定了公司温室气体清单…

确定性最大似然(DML)估计测角

1. 最大似然函数 贝叶斯方法是基于统计理论的一种经典方法&#xff0c;适合于有关参数估计问题。最大似然 (Maximum Likelihood&#xff0c;ML) 估计方法就是贝叶斯估计方法的一种特例&#xff0c;是在已知高斯噪声情况下的贝叶斯最优估计。在ML算法中&#xff0c;观测所得信号…

品牌出海新篇章:独立站构建与流量转化策略

在当今数字化时代&#xff0c;品牌出海已成为许多企业拓展国际市场的重要途径之一。在这个过程中&#xff0c;构建一个高效、专业的独立站&#xff0c;成为了品牌出海的重要一环。独立站不仅有助于企业塑造独特的品牌形象&#xff0c;更能通过精准的营销策略提高流量和转化率&a…

乘用车整车太阳光模拟加速老化试验太阳光模拟器

1.阳光模拟试验介绍 太阳辐射会对室外停放的汽车内外饰件产生热效应和光化学效应&#xff0c;影响汽车内外饰件的外观、性能&#xff0c;对汽车质产生不利影响。按照汽车产环境试验标准的要求&#xff0c;汽车在研制定型之前应进行太阳辐射试验&#xff0c;以考虑其对太阳辐射环…
最新文章