2016-05-17 4 views
-1

私はKryoを使用してユーザーデータのバイナリファイルを保存しています。ユーザーは自分のアプリケーションで自分のファイルの1つを開くことができます。私は、他のタイプのファイルを開こうとしたかどうかを検出するためのきれいなアプローチがあるかどうかはわかりません。ファイルの種類が適切でないかどうかをきれいに判断するにはどうすればよいですか?

今、私はユーザーのデータの前にファイルに単純な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(); 
} 

私は、ファイルを読み込むときに、私は、ファイルヘッダとユーザープロジェクトをデシリアライズして発生する可能性のある例外をキャッチしようとすることができます。しかし、catch-allブロックを実行すると、例外なくユーザーにエラーを表示するより洗練された方法で、おそらく対応できる特定の問題を隠すことができます。ここで私が今やっているものです:

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などのように、すべてのファイルの先頭に数バイトあります。したがって、これらのタイプが異なる拡張子で保存されていても、ファイルのマジックナンバーがOKかどうかを確認できます。

Magic Number Description

あなたがシリアライズおよびデシリアライズしている場合しかし、あなたはシリアライズした後、ファイルにいくつかの追加データにタックと非直列化する前にそれを削除する必要があります。

関連する問題