如何清楚地确定文件是否不是我想要的类型?

时间:2016-05-17 16:53:36

标签: java file kryo

我正在使用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();
    }
}

我认为还有一个非常微小(无穷小?)的机会,某些文件实际加载而不会抛出异常,在这种情况下,我的应用程序中的其他地方可能会发生非常意外的错误。不确定我是否应该担心这个问题......用户不应期望打开不正确的文件类型并使其正常工作。

1 个答案:

答案 0 :(得分:0)

您可以使用幻数,这是一组描述文件类型的字节。像.jpg,.pdf,.wav等在每个文件的开头都有几个字节,所以即使这些类型用不同的扩展名保存,你也可以检查文件的幻数是否正常。

Magic Number Description

但是,如果您要进行序列化和反序列化,则可能需要在序列化后将一些其他数据添加到文件中,并在反序列化之前将其删除。