文件頭通常包含 Magic Number(魔數),用於標識文件類型。例如 EXE 文件使用 PE 格式,其特徵標識為 MZ(十六進制 4D 5A)。
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("類型: 未知或需更多字節識別");
}
}
}
<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 高效讀取