工具类 MagicNumberUtils
package creationPattern.prototype.wenjianmoshu; import java.util.HashMap; import java.util.Map; public class MagicNumberUtils { /** * 魔数到文件类型的映射集合 */ public static final Map<String, String> TYPES = new HashMap(); static { // 图片,此处只提取前六位作为魔数 TYPES.put("FFD8FF", "jpg"); TYPES.put("89504E", "png"); TYPES.put("474946", "gif"); TYPES.put("524946", "webp"); //音频文件的魔数 TYPES.put("494433", "mp3"); TYPES.put("000000", "m4a"); } /** * 根据文件的字节数据获取文件类型 * * @param data 文件字节数组数据 * @return */ public static String getFileType(byte[] data) { //提取前六位作为魔数 String magicNumberHex = getHex(data, 6); //System.out.println(magicNumberHex); return TYPES.get(magicNumberHex); } /** * 获取16进制表示的魔数 * * @param data 字节数组形式的文件数据 * @param magicNumberLength 魔数长度 * @return */ public static String getHex(byte[] data, int magicNumberLength) { //提取文件的魔数 StringBuilder magicNumber = new StringBuilder(); //一个字节对应魔数的两位 int magicNumberByteLength = magicNumberLength / 2; for (int i = 0; i < magicNumberByteLength; i++) { magicNumber.append(Integer.toHexString(data[i] >> 4 & 0xF)); magicNumber.append(Integer.toHexString(data[i] & 0xF)); } return magicNumber.toString().toUpperCase(); } }
测试类 test
package creationPattern.prototype.wenjianmoshu; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class test { public static void main(String[] args) throws IOException { System.out.println(MagicNumberUtils.getFileType(getFileBytesData("C:\\Users\\86195\\Desktop\\8.mp3"))); } /** * 读取文件字节数据 * * @param filePath * @return * @throws IOException */ public static byte[] getFileBytesData(String filePath) throws IOException { InputStream fs = new FileInputStream(filePath); byte[] b = new byte[fs.available()]; fs.read(b); return b; } }