2016-11-22 18 views
0

私は基本的に、個々のジャーナルエントリを永続化する必要のあるジャーナルアプリを作成しています。すべてのエントリーを1つのファイルに保存したいと思います。複数のエントリーを同じファイルにシリアライズ

私は、単一のオブジェクトをシリアル化する上でのチュートリアルのトンを見てきたので、私はこの解決策を考え出した、(動作しない)が、私はそれを修正するために管理していても、それはずさんな解決策のように感じています。

は(ここで私は、ArrayListのをシリアル化しようとしている、と私は、エントリを保存するたびに、私はリストをデシリアライズして、もう一度シリアライズする前に、リストに新しいエントリを追加する)、

を明確にするために私の質問をこれは、複数の機会に同じファイルにオブジェクトを保存するための良い方法です。

誰か他の何かについて私は試してみてくださいいくつかのヒントを持っていますか、これに関するビデオやドキュメントへのリンクもありがとうございます。

public class Serializer 
{ 

    //Calls readFile and adds the returned entries to an ArrayList 
    //Add the target object to the list and write to the file 
    public static void writeToFile(Object target) 
    { 
     ArrayList entries = new ArrayList(); 

     entries = readFile(); 
     entries.add(target); 


     String filename = "entries.bin"; 

     FileOutputStream fileOut = null; 
     ObjectOutputStream objOut = null; 

     try 
     { 
      fileOut = new FileOutputStream(filename); 
      objOut = new ObjectOutputStream(fileOut); 
      objOut.writeObject(entries); 
      objOut.close(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 

    //Reads the file and returns all entries in a list 
    public static ArrayList readFile() 
    { 
     ArrayList persistedEntries = new ArrayList<>(); 
     String filename = "entries.bin"; 

     FileInputStream fileIn = null; 
     ObjectInputStream objIn= null; 
     try 
     { 
      fileIn = new FileInputStream(filename); 
      objIn = new ObjectInputStream(fileIn); 
      persistedEntries = (ArrayList) objIn.readObject(); 
      objIn.close(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(ClassNotFoundException ex) 
     { 
      ex.printStackTrace(); 
     } 

     return persistedEntries; 
    } 
} 
+0

を - それが例外をスローしますか?どれ? – Hulk

+0

実際に何がうまくいかないのかどうかはわかりません。なぜなら、インデックスから範囲外の例外が出ているからです。また、ArrayListを理解することができないはずです。しかし、私はその方法だけではなく、プログラムを実行しようとしました。 私の質問は、実際にはコードが機能していないという事実ではなく、「アイデア」が良いかどうか、あるいは完全に何かを見逃して別の方向。 :) –

+0

あなたのコードを見ると、ファイルを書く前に常にあなたが読んでいることに気付きます。空のファイル 'entries.bin'を調べて、返されたArrayListオブジェクトが何であるかを調べる必要がありますか? – jrbeverly

答えて

0

これは、複数回、同じファイルにオブジェクトを保存するための良い方法ですか?

私は議論しません。これは、writeToFileまたはそれ以上の正確な方法appendToFileが、予期しないオブジェクトを持つentries.binなど、エッジのケースで奇妙な動作を引き起こす可能性があるからです。私はこれを主張するでしょう:

writeToFile(ArrayList<Object> target)を使用して、ファイルを指定された配列で上書きします。次に、ディスクからentries.binを読み取るプロセスを処理するメソッドappendToFile(Object target)を追加し、targetを追加して、ディスクにアレイを書き込みます。これには、新しいオブジェクトtargetをディスク上のファイルとマージすることに関連するロジックと、entries.binファイルへの実際の書き込みロジックを分離するという利点があります。

ちょうど学習の練習なら、私は上記と一緒に行くだろう。潜在resource


再フォーマットバージョンを追加:あなたも、それは「動作しない」どの方法に言及した場合にそれが役立つかもしれない

public class Serializer 
{ 
    private String filename; 

    // pass in "entries.bin" 
    public Serializer(String filename) { 
     this.filename = filename; 
    } 

    public void append(Object target) { 
     // readfile will return at least empty arraylist 
     ArrayList entries = readFile(); 
     entries.add(target); 
     serialize(entries); 
    } 

    public void serialize(ArrayList entries) 
    { 
     FileOutputStream fileOut = null; 
     ObjectOutputStream objOut = null; 
     try 
     { 
      fileOut = new FileOutputStream(filename); 
      objOut = new ObjectOutputStream(fileOut); 
      objOut.writeObject(entries); 
      objOut.close(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 

    //Reads the file and returns all entries in a list 
    public ArrayList deserialize() 
    { 
     ArrayList persistedEntries = new ArrayList<>(); 

     FileInputStream fileIn = null; 
     ObjectInputStream objIn = null; 
     try 
     { 
      fileIn = new FileInputStream(filename); 
      objIn = new ObjectInputStream(fileIn); 

      Object result = objIn.readObject(); 
      if (!(result instanceof ArrayList)) { 
       // read object is not an arraylist 
      } 

      persistedEntries = (ArrayList) objIn.readObject(); 
      objIn.close(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(ClassNotFoundException ex) 
     { 
      ex.printStackTrace(); 
     } 

     return persistedEntries; 
    } 
} 
+0

なぜですか? 2番目のメソッドは、リストに追加してから最初のメソッドを呼び出すのと全く同じです。 2行のコード。 – EJP

+0

2番目の方法では、 'appendToFile'を意味しますか?上で述べたように、ロジックと優れたコーディング方法を分離することです。彼が現在作業しているコードでは、 'writeToFile'はメモリデータの構築、ソースからのデータの読み込み、メモリデータ内のソースデータの同期、ソースへのデータの書き込みという、以下の役割を担っています。すべての潜在的なエラーとそれに関連するエッジケースと一緒に。彼は、それぞれの責任を別々の方法に分けるのがより理にかなっています。 – jrbeverly

関連する問題