我開始設計一個應用程序,它將部分運行文件目錄並將其擴展名與其文件頭進行比較。將文件擴展名與文件頭進行比較
有沒有人有任何建議,以最好的方式來解決這個問題?我知道我可以簡單地擁有一個包含文件頭部簽名的查找表。例如,JPEG: \xFF\xD8\xFF\xE0
我希望可能有一個更簡單的方法。
在此先感謝您的幫助。
我開始設計一個應用程序,它將部分運行文件目錄並將其擴展名與其文件頭進行比較。將文件擴展名與文件頭進行比較
有沒有人有任何建議,以最好的方式來解決這個問題?我知道我可以簡單地擁有一個包含文件頭部簽名的查找表。例如,JPEG: \xFF\xD8\xFF\xE0
我希望可能有一個更簡單的方法。
在此先感謝您的幫助。
恐怕它必須比這更復雜。並非每個文件類型都有一個頭文件,有些文件(如RAR)最後的特徵數據結構而不是開頭。
你可能想看看Unix的file
命令,做相同的工作:
如果你不需要做髒活在這些值上(你沒有Linux),你可以簡單地使用外部程序,如TrID,它可以爲你做這件事。
也許你可以只在它的輸出上工作,而不需要自己去做。如果你只有大約20種文件,你必須要管理一個簡單的查找表(例如HashMap<String,byte[]>
)那麼不好。只有當需要的文件格式有一個幻數時,這些纔會起作用,否則你是自己的(或者用外部程序)。
因爲與某些文件類型缺少顯著頭(感謝@邁克爾)的問題,我想創建一個地圖擴展到一種類型檢查的一個簡單的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);
}
}
對於沒有明顯標題的其他類型,您可以完全實現其他類型的檢查。
您可以爲每個文件提取MIME類型並將其與mimetype/extension(Map<String, List<String>>
,第一個String
是mime類型,第二個是有效擴展名列表)的映射進行比較。
資源:
關於同一主題:
可以知道文件中讀取使用Apache蒂卡頭的文件類型。
以下代碼需要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());
此目錄中是否有各種格式的文件,或只是JPEG? – James 2010-09-06 11:21:41
我只會進一步處理大約20個文件類型.doc,.xls,.pdf等。 – Hinchy 2010-09-06 11:25:07