判断一个文件是否为压缩文件,通常可以通过检查文件的魔术字(Magic Number)来实现。魔术字是文件开头的一段特定字节序列,用于标识文件类型。以下是常见压缩文件类型及其魔术字:
- ZIP:
50 4B 03 04
- GZIP:
1F 8B
- TAR:没有固定的魔术字,但通常检查文件扩展名为
.tar
- RAR:
52 61 72 21 1A 07 00
或52 61 72 21 1A 07 01 00
可以编写一个 Java 程序来读取文件的前几个字节,并根据魔术字判断文件类型。以下是示例代码:
示例代码
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class FileTypeChecker {
private static final Map<String, byte[]> FILE_SIGNATURES = new HashMap<>();
static {
// 添加常见压缩文件类型的魔术字
FILE_SIGNATURES.put("ZIP", new byte[]{0x50, 0x4B, 0x03, 0x04});
FILE_SIGNATURES.put("GZIP", new byte[]{0x1F, (byte) 0x8B});
FILE_SIGNATURES.put("RAR", new byte[]{0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00});
FILE_SIGNATURES.put("RAR", new byte[]{0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x01, 0x00});
}
public static void main(String[] args) {
File file = new File("path/to/your/file");
try {
String fileType = getFileType(file);
if (fileType != null) {
System.out.println("The file is a " + fileType + " file.");
} else {
System.out.println("The file type is not recognized as a common compressed file.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static String getFileType(File file) throws IOException {
try (FileInputStream fis = new FileInputStream(file)) {
byte[] fileHeader = new byte[8];
fis.read(fileHeader);
for (Map.Entry<String, byte[]> entry : FILE_SIGNATURES.entrySet()) {
String fileType = entry.getKey();
byte[] signature = entry.getValue();
if (startsWith(fileHeader, signature)) {
return fileType;
}
}
}
return null;
}
private static boolean startsWith(byte[] fileHeader, byte[] signature) {
if (fileHeader.length < signature.length) {
return false;
}
byte[] fileHeaderSubset = Arrays.copyOfRange(fileHeader, 0, signature.length);
return Arrays.equals(fileHeaderSubset, signature);
}
}
代码说明
-
文件签名定义:
- 在
FILE_SIGNATURES
map 中定义常见压缩文件类型的魔术字。
- 在
-
文件类型检测:
getFileType
方法读取文件的前几个字节,并检查它们是否与任何已知的魔术字匹配。startsWith
方法比较文件头部与魔术字。
使用方法
- 替换
path/to/your/file
为你想要检查的文件路径。 - 运行程序,它将输出文件的类型(如果是已知的压缩文件)。
扩展
你可以根据需要扩展 FILE_SIGNATURES
map,添加更多文件类型的魔术字来识别其他文件类型。