2

トーナメントでの競技データを追跡するクラスを作成しています。このクラスをファイルに保存したいので、ObjectInputStream. 私が書いているクラスは、Serializable を実装しています。SO や他の場所で見つけた解決策は、実際にはこの問題に対処してEOFExceptionいません。

私のファイルライターは次のとおりです。

public void writeToFile(String path) {
    File f = new File(path);
    if(f.exists()) f.delete();

    try {
        OutputStream fileOut = new FileOutputStream(path);
        OutputStream bufferOut = new BufferedOutputStream(fileOut);
        ObjectOutput output = new ObjectOutputStream(bufferOut);

        output.writeObject(this);
    } catch(IOException e) {}
}

私のファイルリーダーは次のとおりです。

public static DivisionDataFTC readFromFile(String path) {
    try {
        InputStream fileIn = new FileInputStream(path);
        InputStream bufferIn = new BufferedInputStream(fileIn);
        ObjectInput input = new ObjectInputStream(bufferIn);

        System.out.println(input.read());
    } catch(Exception e) {
        System.out.println(path);
        e.printStackTrace();
    }

    if(1==1) throw new Error("Could not read DivisionDataFTC at " + path);
    return null;
}

データを正常に書き込みました - ファイルが空でないことを確認しました。(関連する場合、その内容は一貫して 7.99kb です)。

明確にするために、エラーは ObjectOutputStream のインスタンス化では発生しません。これがこの質問の違いです。エラーは readObject() 呼び出しで発生します。私の出力は非常に長いEOFExceptionです:

java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2571)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
    at java.util.ArrayList.readObject(ArrayList.java:733)
    (...cut out most of this because nobody wants to read it...)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
    at tournamentftc.DivisionDataFTC.readFromFile(DivisionDataFTC.java:297)
    at firstscouting.FIRSTScouting.runGUI(FIRSTScouting.java:82)
    at firstscouting.FIRSTScouting.main(FIRSTScouting.java:101)
Exception in thread "main" java.lang.Error: Could not read DivisionDataFTC at C:\Users\Noah\Desktop\out.ser
    at tournamentftc.DivisionDataFTC.readFromFile(DivisionDataFTC.java:303)
    at firstscouting.FIRSTScouting.runGUI(FIRSTScouting.java:82)
    at firstscouting.FIRSTScouting.main(FIRSTScouting.java:101)

なぜこれが起こっているのかわかりません。どうすればこれを処理できますか?

4

2 に答える 2

5

ObjectOutputStream を閉じる必要があります。

 ObjectOutput output = new ObjectOutputStream(bufferOut);
 output.writeObject(this);
 output.close();
于 2013-03-02T05:46:31.983 に答える
4

出力ストリームを閉じる必要があり、readObject() を呼び出さずに呼び出す必要もあります。

于 2013-03-02T05:47:27.653 に答える