11

次のコードはを生成しEOFExceptionます。何故ですか?

public static Info readInfoDataFromFile(Context context) {
    Info InfoData = null;
    FileInputStream fis = null;
    ObjectInputStream ois = null;
    Object object = null;

    if (context.getFileStreamPath("InfoFile.dat").exists()) {
        try {
            fis = context.openFileInput("InfoFile.dat");
            ois = new ObjectInputStream(fis);
            Object temp;
            try {
                // here it throws EOF exception in while loop 
                while ((temp = ois.readObject()) != null) {
                    object = temp;
                }
            } catch (NullPointerException npe) {
                npe.printStackTrace();
            } catch (EOFException eof) {
                eof.printStackTrace();
            } catch (FileNotFoundException fnfe) {
                fnfe.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (ois != null) {
                    ois.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

スタックトレース:

03-07 14:29:01.996: WARN/System.err(13984): java.io.EOFException
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.DataInputStream.readByte(DataInputStream.java:131)
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.nextTC(ObjectInputStream.java:628)
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:907)
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2262)03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2217)
03-07 14:29:01.996: WARN/System.err(13984):     at 
4

5 に答える 5

9

ファイルに含まれるオブジェクトの数によって異なります。オブジェクトが1つしかない場合は、1つのステップで逆シリアル化できます。

try {
    Object temp = ois.readObject();
}
catch(Exception e) {
    //handle it
}
于 2011-03-07T09:30:47.357 に答える
8

まず、ストリームの作成時にストリームに書き込んだ場合にreadObject()のみ戻ります。ストリームにこれ以上データがない場合は、をスローします。nullnullEOFException

EOFを予期しない場合、その理由はおそらくストリームが破損していることです。これは、データを書き込んだ後で閉じるのを忘れた場合に発生する可能性があります。

于 2011-03-07T09:43:23.833 に答える
5

私も同じ不思議なEOFExceptionことに、を渡って送信するのはオブジェクトクラスのパスだけでしObjectOutputStreamObjectInputStream。それらは同じパス(同じパッケージ名、そしてもちろん同じクラス名)を持っている必要があります。

于 2013-04-18T10:26:39.743 に答える
2

readObject()onの定義は、ストリームの終わりに達したときにObjectInputStream戻ることを指定していません。null代わりに、ファイルの終わりを超えて追加のオブジェクトを読み取ろうとすると、例外がスローされます。

于 2011-03-07T09:38:03.997 に答える
0

OutputStream.write()を使用して書き込みintInputStream.readInt()読み取りを行ったため、このエラーが発生しました。

ただし、OutputStream.writeドキュメントbyteに従ってを記述します(putはintパラメータとしてを受け入れます)ので、代わりにを使用する必要がありましたOutputStream.writeInt

于 2020-07-31T09:15:42.610 に答える