2011-07-05 10 views
0

以下の方法で2人の読者を読みたいと思っています。ファイルから2つの異なるオブジェクトを読む

public static ArrayList<Contestant> readContestantsFromFile() throws IOException, ClassNotFoundException { 
    FileInputStream fis = new FileInputStream("minos.dat"); 
    ObjectInputStream ois = new ObjectInputStream(fis); 

    ArrayList<Contestant> contestants = (ArrayList<Contestant>) ois.readObject(); 

    ois.close(); 

    return contestants; 
} 
public static ArrayList<Times> readContestantsFromFile() throws IOException, ClassNotFoundException { 
    FileInputStream fis = new FileInputStream("minos.dat"); 
    ObjectInputStream ois = new ObjectInputStream(fis); 

    ArrayList<times> times = (ArrayList<Times>) ois.readObject(); 
    ois.close(); 
    return times; 
} 

ビットこれは機能しません。それは私が救った第二のarraylistタイプにキャストすることはできません。だから私はこれにどのようにアクセスできますか?私が得た正確なエラーは、このでした:

Exception in thread "main" java.lang.ClassCastException: com.deanchester.minos.model.Contestant cannot be cast to com.deanchester.minos.model.Times 
at com.deanchester.minos.tests.testAddTime.main(testAddTime.java:31) 

これが参照しているというラインです:

ArrayList<times> times = (ArrayList<Times>) ois.readObject(); 

だから私は一つのファイルから2つの異なる配列リストを読み込むことができますか?

+0

なぜテストしませんか?それが一般的に最も良い方法です。 –

+0

@ Zhehao、たくさんの不要なコードを書いていると思っていたので、テストしたくはありませんでした。 – Dean

答えて

0

2番目のファイルを書き込むときにFileOutputStream fos = new FileOutputStream("minos.dat", true);を使用します。 trueは、引数 "append"の値です。それ以外の場合は、ファイルの内容を上書きします。これは、同じコレクションを2度読んだ理由です。

ファイルから2番目のコレクションを読み込むときは、2番目のコレクションの先頭にスキップする必要があります。これを行うには、最初のフェーズで読み込んだバイト数を覚えてから、メソッドskip()を使用します。

しかし、もっと良い解決策は、一度しかファイルを開くことではありません(新しいFileInputStreamと新しいFileOutputStreamを一度呼び出すことです)、コレクションを読み込むメソッドに渡してください。

+0

2番目のパラグラフについてもう少し詳しくお聞かせください。どのクラスが 'skip()'ですか(java APIにリンクできますか?) – Dean

0

あなたはObjectInputStreamを使用してファイルから2つの異なるオブジェクトを読み取ることができますが、あなたの問題は、それはあなたがArrayList<Contestant>を持っていると、あなたArrayList<Times>ファイルの先頭から始まるので、あなたは、ストリームを再開するという事実から来ています。一度にすべてを行い、両方のリストを返すようにしてください:

public static ContestantsAndTimes readObjectsFromFile() throws IOException, ClassNotFoundException { 
    FileInputStream fis = new FileInputStream("minos.dat"); 
    ObjectInputStream ois = new ObjectInputStream(fis); 

    ArrayList<Contestant> contestants = (ArrayList<Contestant>) ois.readObject(); 
    ArrayList<Times> times = (ArrayList<Times>) ois.readObject(); 
    ois.close(); 

    return new ContestantsAndTimes(contestants, times); 
} 
関連する問題