2017-01-15 10 views
1

私は理解できない奇妙な問題に遭遇しました。 ファイルからデータを読み込むプログラムを作っています。しかし、私がデータを読み込むとすぐに、私はEOFExceptionを受け取ります。FileInputStream.available()はバイトを返しますが、ObjectInputStream.available()は0を返します

ファイルが空であるかどうかは、.available()で確認しました。そして私は奇妙な結果を得ました。 FileInputStreamはファイルがいっぱいになっていると言いましたが(249バイト)、ObjectInputStreamはファイルが空である(または読み込めない)と言っています。

EOFException at "int signatureSize = ois.readInt();"

 FileInputStream fin = new FileInputStream("input(signedbyLK).ext"); 
     System.out.println("fin available: " + fin.available()); 

     ObjectInputStream ois = new ObjectInputStream(fin); 
     System.out.println("ois avaiable: " + ois.available()); 

     int signatureSize = ois.readInt(); 
     byte[] sigBytes = (byte[]) ois.readObject(); 
     String text = (String) ois.readObject(); 
     ois.close(); 

編集:私はこのようなファイルにコンテンツを追加している:

 File newFile = new File("input(signedbyLK).ext"); 
     newFile.createNewFile(); 

     System.out.println("Succesfully created new file: " + newFile.getName()); 

     ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(newFile)); 
     oos.writeObject(sigBytes.length); 
     oos.writeObject(sigBytes); 
     oos.writeObject(readInput()); 
     oos.close(); 

答えて

1

ここでの境界を越えてオブジェクトデータを読み込むしようとすると、javadocは

を言っていることです対応するwriteObjectメソッドによって書き込まれたカスタムデータの は、 のeofフィールド値がtrueのOptionalDataExceptionをスローします。 割り当てられたデータの終わりを超えた非オブジェクトの読み取りは、 のストリームの終わりを示すのと同じ方法でデータの終わりを反映します。バイト読み取りでは-1が読み込みバイトとして返され、 バイト数読み取り、およびプリミティブ読み取りはEOFExceptionをスローします。 対応するwriteObjectメソッドがない場合、デフォルトの末尾である は、割り当てられたデータの最後を示します。

また、あなたが

+0

それをシリアライズするとき、私は私の質問を編集したのと同じ順序でオブジェクト入力ストリームを読み込む必要があります。これで、ファイルをどの順番で埋めるかを確認できます。 – Guido

+2

あなたの読み取り呼び出しは、書き込み呼び出しに対応していません。あなたの最初の書き込み呼び出しはオブジェクトですが、あなたの最初の読み込みはintです – Biu

+0

うわー、私はそれに気付かなかった。ありがとうございました! – Guido

関連する問題