6

以下のメソッドは、バイナリ ファイルをarrayList. しかし、取得java.io.EOFException

java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2553) で
java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1296) で
java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) で
at .... Read(Tester.java:400)
at .... main(Tester.java:23)

main の 23 行目はメソッドを呼び出すだけで、400 行目は以下の while ループです。何か案は?

private static void Read() {
    try {
        ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("/file.bin"));
        while (objIn.readObject() != null) {
            list.add((Libreria) objIn.readObject());
        }
        objIn.close();
    } catch(Exception e) {
        e.printStackTrace();
    }
}
4

4 に答える 4

9

他の答えのように、あなたはループの中で二度読んでいます。他の問題はヌルテストです。readObject()EOSではなくnullを書き込んだ場合にのみnullを返すため、ループ終了テストとして使用してもあまり意味がありません。readObject()ループの正しい終了は次のとおりです。

catch (EOFException exc)
{
 in.close();
 break;
}
于 2011-06-27T00:33:19.497 に答える
7

問題は、ループ内で readObject() を 2 回呼び出していることです。代わりにこれを試してください:

MediaLibrary obj = null;
while ((obj = (MediaLibrary)objIn.readObject()) != null) {
     libraryFromDisk.add(obj);
}
于 2011-06-26T14:06:32.200 に答える
4

while テストでオブジェクトを読み取っています。

while (objIn.readObject() != null)

次に、次のオブジェクトを読み取ります。

libraryFromDisk.add((MediaLibrary) objIn.readObject());

したがって、1回の反復で1つのオブジェクトのみを読み取る必要があります

private static void Load() {
    try {
        ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("/file.bin"));
        Object object = objIn.readObject();
        while (object != null) {
           libraryFromDisk.add((MediaLibrary) object);
           object = objIn.readObject();

        }
        objIn.close();
    } catch(Exception e) {
        e.printStackTrace();
    }
}
于 2011-06-26T14:11:34.267 に答える