Java获取文件类型,FileTypeUtil、Files、MimetypesFileTypeMap、URL多种实现对比
说说需求: 工作中需要判断文件是否是音频文件,实际生产环境中,遇到用户修改文件后缀的情况,导致逻辑处理异常。
正确获取到文件的类型是核心工作了,以下是实现的方案:
hutool的FileTypeUtilJDK的FilesJDK的MimetypesFileTypeMapJDK的URLguava的Files
引入依赖:
代码实现:
public class FileTypeUtils {
protected final static MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap();
public static void main(String[] args) throws IOException {
List
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干音_响度归一化.mp3getFileTypeByHuToolwavwavmp3 ×mp3getFileTypeByJdkFilesaudio/wavaudio/mpeg ×audio/mpeggetFileTypeByJdkMimetypesFileTypeMapaudio/x-wavaudio/mpeg ×audio/mpeggetFileTypeByJdkURLsaudio/x-wavaudio/x-wavcontent/unknown ×getFileTypeByGuavaFileswavmp3 ×mp3
结论: 优先使用JDK URL的检测方式,再使用JDK Files方式,优点是无需引入额外的依赖包,也能保证正确性。