2016-05-17 19 views
-1

我正在使用Kryo來保存用戶數據的二進制文件。用戶可以在我的應用程序中打開其中的一個文件。我不確定我是否有乾淨的方法來檢測他們是否嘗試打開其他類型的文件。如何清楚地確定文件是否不是我想要的類型?

現在,我正在寫一個簡單的FileHeader對象到用戶數據之前的文件。文件標題包含有關應用程序的哪個版本保存了該文件的信息。

public void write (UserProject project, File file) throws FileNotFoundException { 
    OutputStream outputStream = new DeflaterOutputStream(new FileOutputStream(file)); 
    Output output = new Output(outputStream); 
    kryo.writeObject(output, new FileHeader()); 
    kryo.writeObject(output, project); 
    output.close(); 
} 

所以,當我打開一個文件,我可以嘗試反序列化的文件頭和用戶項目,抓住任何可能發生的異常。但是,做一個全面封鎖可能會隱藏某些問題,我可能會以一種更優雅的方式作出反應,無論這種例外情況如何,都會向用戶顯示錯誤。下面是我現在在做什麼:

public Project read (File file) throws FileNotFoundException, FileVersionException, UnreadableException { 
    InputStream inputStream = new InflaterInputStream(new FileInputStream(file)); 
    Input input = new Input(inputStream); 

    try { 
     FileHeader fileHeader = kryo.readObject(input, FileHeader.class); 

     if (fileHeader.fileVersion > CURRENT_FILE_VERSION) 
      throw new FileVersionException(/* */); 

     Project project = kryo.readObject(input, Project.class); 
     return project; 
    } catch (Exception e){ 
     if (DEBUG) e.printStackTrace(); 
     throw new UnreadableException(e); //caller will show user error msg 
    } finally { 
     input.close(); 
    } 
} 

我想也有一個非常小的(無窮小?)的機會,一些文件實際上加載未拋出異常,在這種情況下,很意外的錯誤可能在我的應用程序的其他地方發生。不知道我是否應該擔心這個......用戶不應該期望打開不正確的文件類型並使其正常工作。

回答

0

您可以使用幻數,這是描述文件類型的一組字節。和.jpg,.pdf,.wav等一樣,每個文件的開頭都有幾個字節,所以即使這些類型以不同的擴展名保存,您也可以檢查文件的幻數是否正確。

Magic Number Description

但是,如果你序列化和反序列化,你可以有序列化後的一些額外的數據,該文件以粘性和反序列化之前將其刪除。

相關問題