2016-05-17 51 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

但是,如果你序列化和反序列化,你可以有序列化后的一些额外的数据,该文件以粘性和反序列化之前将其删除。

相关问题