我开始设计一个应用程序,它将部分地运行一个文件目录并将它们的扩展名与它们的文件头进行比较。
有没有人对最佳方法有任何建议?我知道我可以简单地找到一个包含文件头标签的查找表。例如,JPEG: \xFF\xD8\xFF\xE0
我希望可能有一种简单的方式。
提前感谢您的帮助。
答案 0 :(得分:1)
我担心它必须比这更复杂。并非每种文件类型都有标题,有些(例如RAR)在结尾而不是在开头都有其特有的数据结构。
您可能需要查看Unix file
命令,它执行相同的工作:
答案 1 :(得分:0)
如果你不需要对这些值进行肮脏的工作(并且你没有linux),你可以简单地使用能够为你做这件事的外部程序,如TrID。
也许你可以自己处理它的输出,而不必自己动手做..如果你只有大约20种文件,你必须管理它们有一个简单的查找表(例如。HashMap<String,byte[]>
)并不是那么糟糕。只有当desidered文件格式有一个幻数时才会有效,否则你自己(或使用外部程序)。
答案 2 :(得分:0)
由于某些文件类型缺少重要标题的问题(感谢@Michael),我会创建一个类型检查器的扩展地图,其中包含一个简单的API,如
public interface TypeCheck throws IOException {
public boolean isValid(InputStream data);
}
现在您可以编写类似
的代码File toBeTested = ...;
Map<String,TypeCheck> typeCheckByExtension = ...;
TypeCheck check = typeCheckByExtension.get(getExtension(toBeTested.getName()));
if (check != null) {
InputStream in = new FileInputStream(toBeTested);
if (check.isValid(in)) {
// process valid file
} else {
// process invalid file
}
in.close();
} else {
// process unknown file
}
例如,JPEG的标题检查可能看起来像
public class JpegTypeCheck implements TypeCheck {
private static final byte[] HEADER = new byte[] {0xFF, 0xD8, 0xFF, 0xE0};
public boolean isValid(InputStream data) throws IOException {
byte[] header = new byte[4];
return data.read(header) == 4 && Arrays.equals(header, HEADER);
}
}
对于没有重要标题的其他类型,您可以完全实现其他类型检查。
答案 3 :(得分:0)
您可以为每个文件提取mime类型,并将其与mimetype / extension(Map<String, List<String>>
的地图进行比较,第一个String
是mime类型,第二个是有效扩展名列表)
资源:
关于同一主题:
答案 4 :(得分:0)
您可以使用apache tika了解读取标题的文件的文件类型。
以下代码需要apache tika jar。
InputStream is = MainApp.class.getResourceAsStream("/NetFx20SP1_x64.txt");
BufferedInputStream bis = new BufferedInputStream(is);
AutoDetectParser parser = new AutoDetectParser();
Detector detector = parser.getDetector();
Metadata md = new Metadata();
md.add(Metadata.RESOURCE_NAME_KEY,MainApp.class.getResource("/NetFx20SP1_x64.txt").getPath());
MediaType mediaType = detector.detect(bis, md);
System.out.println("MIMe Type of File : " + mediaType.toString());