java如何明确地确定文件是否不是我想要的类型?
我正在使用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 楼答案
你可以使用幻数,一组描述文件类型的字节。喜欢jpg。pdf。wav等文件的开头都有几个字节,所以即使这些类型以不同的扩展名保存,你也可以检查文件的魔法数字是否正确
Magic Number Description
但是,如果要序列化和反序列化,则可能必须在序列化后向文件添加一些附加数据,并在反序列化之前将其删除