2010-09-06 105 views
1

我開始設計一個應用程序,它將部分運行文件目錄並將其擴展名與其文件頭進行比較。將文件擴展名與文件頭進行比較

有沒有人有任何建議,以最好的方式來解決這個問題?我知道我可以簡單地擁有一個包含文件頭部簽名的查找表。例如,JPEG: \xFF\xD8\xFF\xE0

我希望可能有一個更簡單的方法。

在此先感謝您的幫助。

+0

此目錄中是否有各種格式的文件,或只是JPEG? – James 2010-09-06 11:21:41

+0

我只會進一步處理大約20個文件類型.doc,.xls,.pdf等。 – Hinchy 2010-09-06 11:25:07

回答

0

如果你不需要做髒活在這些值上(你沒有Linux),你可以簡單地使用外部程序,如TrID,它可以爲你做這件事。

也許你可以只在它的輸出上工作,而不需要自己去做。如果你只有大約20種文件,你必須要管理一個簡單的查找表(例如HashMap<String,byte[]>)那麼不好。只有當需要的文件格式有一個幻數時,這些纔會起作用,否則你是自己的(或者用外部程序)。

0

因爲與某些文件類型缺少顯著頭(感謝@邁克爾)的問題,我想創建一個地圖擴展到一種類型檢查的一個簡單的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); 
    } 
} 

對於沒有明顯標題的其他類型,您可以完全實現其他類型的檢查。

0

可以知道文件中讀取使用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());