说说需求:
工作中需要判断文件是否是音频文件,实际生产环境中,遇到用户修改文件后缀的情况,导致逻辑处理异常。
正确获取到文件的类型是核心工作了,以下是实现的方案:
- hutool的FileTypeUtil
- JDK的Files
- JDK的MimetypesFileTypeMap
- JDK的URL
- 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方式,优点是无需引入额外的依赖包,也能保证正确性。