Java 如何通過Magic 魔數(shù)獲取文件類型
Magic 魔數(shù)獲取文件類型
魔數(shù)有很多種定義,這里我們討論的主要是在編程領域的定義,文件的起始幾個字節(jié)的內(nèi)容是固定的(或是有意填充,或是本就如此),這幾個字節(jié)的內(nèi)容也被稱為魔數(shù)(magic number),因此可以根據(jù)這幾個字節(jié)的內(nèi)容確定文件類型。
常見文件類型的魔數(shù)
public enum FileType { /** * JPEG */ JPEG("JPEG", "FFD8FF"), /** * PNG */ PNG("PNG", "89504E47"), /** * GIF */ GIF("GIF", "47494638"), /** * TIFF */ TIFF("TIFF", "49492A00"), /** * Windows bitmap */ BMP("BMP", "424D"), /** * CAD */ DWG("DWG", "41433130"), /** * Adobe photoshop */ PSD("PSD", "38425053"), /** * Rich Text Format */ RTF("RTF", "7B5C727466"), /** * XML */ XML("XML", "3C3F786D6C"), /** * HTML */ HTML("HTML", "68746D6C3E"), /** * Outlook Express */ DBX("DBX", "CFAD12FEC5FD746F "), /** * Outlook */ PST("PST", "2142444E"), /** * doc;xls;dot;ppt;xla;ppa;pps;pot;msi;sdw;db */ OLE2("OLE2", "0xD0CF11E0A1B11AE1"), /** * Microsoft Word/Excel */ XLS_DOC("XLS_DOC", "D0CF11E0"), /** * Microsoft Access */ MDB("MDB", "5374616E64617264204A"), /** * Word Perfect */ WPB("WPB", "FF575043"), /** * Postscript */ EPS_PS("EPS_PS", "252150532D41646F6265"), /** * Adobe Acrobat */ PDF("PDF", "255044462D312E"), /** * Windows Password */ PWL("PWL", "E3828596"), /** * ZIP Archive */ ZIP("ZIP", "504B0304"), /** * ARAR Archive */ RAR("RAR", "52617221"), /** * WAVE */ WAV("WAV", "57415645"), /** * AVI */ AVI("AVI", "41564920"), /** * Real Audio */ RAM("RAM", "2E7261FD"), /** * Real Media */ RM("RM", "2E524D46"), /** * Quicktime */ MOV("MOV", "6D6F6F76"), /** * Windows Media */ ASF("ASF", "3026B2758E66CF11"), /** * MIDI */ MID("MID", "4D546864"); private String key; private String value; FileType(String key, String value) { this.key = key; this.value = value; } public String getValue() { return value; } public String getKey() { return key; } }
文件類型工具類
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class FileUtil { /** * 獲取文件投 * * @param filePath 文件路徑 * @return 16 進制的文件投信息 * @throws IOException */ private static String getFileHeader(String filePath) throws IOException { byte[] b = new byte[28]; InputStream inputStream = new FileInputStream(filePath); inputStream.read(b, 0, 28); inputStream.close(); return bytes2hex(b); } /** * 將字節(jié)數(shù)組轉換成16進制字符串 */ private static String bytes2hex(byte[] src) { StringBuilder stringBuilder = new StringBuilder(""); if (src == null || src.length <= 0) { return null; } for (byte b : src) { int v = b & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } return stringBuilder.toString(); } /** * 根據(jù)文件路徑獲取文件類型 * * @param filePath 文件路徑 * @return 文件類型 * @throws IOException */ public static FileType getFileType(String filePath) throws IOException { String fileHead = getFileHeader(filePath); if (null == fileHead || fileHead.length() == 0) { return null; } fileHead = fileHead.toUpperCase(); FileType[] fileTypes = FileType.values(); for (FileType type : fileTypes) { if (fileHead.startsWith(type.getValue())) { return type; } } return null; } }
使用
public static void main(String[] args) throws IOException { String filePath = "/Users/ziyou/Downloads/SpringBoot實戰(zhàn).png"; FileType fileType = getFileType(filePath); System.out.println(fileType.getKey()); }
到此這篇關于Java Magic 魔數(shù)獲取文件類型的文章就介紹到這了,更多相關Java獲取文件類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用Java和SpringBoot實現(xiàn)服務器發(fā)送事件(Server-Sent Events)
使用Java開發(fā)web應用,大多數(shù)時候我們提供的接口返回數(shù)據(jù)都是一次性完整返回,有些時候,我們也需要提供流式接口持續(xù)寫出數(shù)據(jù),以下提供一種簡單的方式,本文給大家介紹了如何在Java web中實現(xiàn)服務器發(fā)送事件,需要的朋友可以參考下2024-02-022024版本IDEA創(chuàng)建Servlet模板的圖文教程
新版IDEA?2024.1.4中,用戶需要自行創(chuàng)建Servlet模板以解決Web項目無法通過右鍵創(chuàng)建Servlet的問題,本文詳細介紹了添加ServletAnnotatedClass.java模板的步驟,幫助用戶快速配置并使用新的Servlet模板,需要的朋友可以參考下2024-10-10Springboot應用中線程池配置詳細教程(最新2021版)
這篇文章主要介紹了Springboot應用中線程池配置教程(2021版),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03【spring-boot】快速構建spring-boot微框架的方法
本篇文章主要介紹了【spring-boot】快速構建spring-boot微框架的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12SpringBoot參數(shù)校驗之@Valid的使用詳解
這篇文章主要通過示例為大家詳細介紹一下介紹了SpringBoot參數(shù)校驗中@Valid的使用方法,文中的示例代碼講解詳細,需要的可以參考一下2022-06-06