首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 獲取文件頭信息(Magic Number)完整指南

     編輯:程式設計綜合問答

核心概念

文件頭通常包含 Magic Number(魔數),用於標識文件類型。例如 EXE 文件使用 PE 格式,其特徵標識為 MZ(十六進制 4D 5A)。

Java 實現代碼

import java.io.*;

public class FileHeaderReader {
    public static void main(String[] args) throws IOException {
        File file = new File("a.exe");
        try (RandomAccessFile raf = new RandomAccessFile(file, "r")) {
            // 讀取前 64 字節通常足夠識別大多數文件類型
            byte[] header = new byte[64];
            raf.readFully(header);
            
            // 輸出十六進制
            System.out.print("文件頭: ");
            for (byte b : header) {
                System.out.printf("%02X ", b);
            }
            System.out.println();
            
            // 簡單識別常見類型
            identifyFileType(header);
        }
    }
    
    static void identifyFileType(byte[] header) {
        if (header.length >= 2 && header[0] == (byte)0x4D && header[1] == (byte)0x5A) {
            System.out.println("類型: PE 可執行文件 (EXE/DLL/SYS)");
        } else if (header.length >= 4 && header[0] == (byte)0x89 && header[1] == 'P' && header[2] == 'N' && header[3] == 'G') {
            System.out.println("類型: PNG 圖片");
        } else if (header.length >= 3 && header[0] == (byte)0xFF && header[1] == (byte)0xD8 && header[2] == (byte)0xFF) {
            System.out.println("類型: JPEG 圖片");
        } else if (header.length >= 4 && header[0] == 'P' && header[1] == 'K' && header[2] == 0x03 && header[3] == 0x04) {
            System.out.println("類型: ZIP/JAR/APK/DOCX 等");
        } else {
            System.out.println("類型: 未知或需更多字節識別");
        }
    }
}

進階:使用 Apache Tika 自動識別

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-core</artifactId>
    <version>2.9.1</version>
</dependency>

// 使用
try (InputStream is = new FileInputStream("a.exe")) {
    String mimeType = new Tika().detect(is);
    System.out.println("MIME 類型: " + mimeType);
}

參考資源

注意事項

  • 僅讀取文件頭不會執行任何代碼,安全無毒
  • 某些加密/加殼文件可能隱藏真實魔數
  • 大文件建議使用 RandomAccessFile 或 FileChannel 高效讀取
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved