1

私はスケジュール帳を作成しており、すべてのオブジェクトを .txt に保存しています。これは正常に動作します。問題はそれらを読み取るときに発生し、プログラムは読み取ります。ファイルの終わりが来ると、プログラムは認識しません。何をすべきか、今は混乱しているので私のコードは入れませんが、これが私の先生のコードです。

try{
  //***Instructions for reading***

  //It creates a streamobject with the file's name and asigned format

  FileInputStream fileIn = new FileInputStream("Serializado.txt");

  //It creates an inputobject, so it can represent the object

  ObjectInputStream objIn= new ObjectInputStream(fileIn);

  while (fileIn != null) {

    //with readObject() method,  it extracts the object's content                               

    obInp= (NewAlumno) objIn.readObject(); //Se hace un "cast" a NewAlumno
    System.out.print("Nombre   :" + obInp);
    System.out.print(", Sexo: " + obInp.getSexo());
    System.out.print(", Direccion: "+ obInp.getDireccion());    
    System.out.print(", Promedio: " + obInp.getpromedioPoo());
    System.out.print(", Telefono: " + obInp.getTelefono()+"\n");
  }

  objIn.close();
} catch(Exception e){}  

}

ご覧のとおり、キャッチ例外は空なので、先生のコードを使用すると問題なく動作しているように見えますが、そこに println を配置すると、常に出力されます。何かが間違っていることを意味し、それが

while(fileIn != null)

なぜなら、Netbeans は、この式が null になることはないと言っているからです。だから私は、プログラムがファイルの終わりに達した後、何をすべきかを知らないと推測しています. よろしくお願いします!

例外は次のとおりです。

java.io.EOFException 
  at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2‌​577) 
  at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315) 
  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 
  at profegraba.Persistencia.main(Persistencia.java:81)
4

3 に答える 3

2

whileループは完全に間違っています

while (fileIn != null) {

入力ファイルが存在する場合、fileIn常に非 null になります。fileInただし、ファイル パスが間違っている場合に備えて、構築後すぐに nullかどうかを確認する必要があります。

while ループがなければ、ストリームから 1 つのオブジェクトを読み取るだけです。これが正しいかどうか、私にはわかりません。ただし、対応する数のオブジェクトを読み戻せるように、ストリームに書き込まれたオブジェクトの数を知っておく必要があります。

(を取得するまで読むことはできますが、EOFException個人的にはそれを容認しません。代わりに、いくつかのサブオブジェクトを含むコンテナ オブジェクトを格納することをお勧めします。EOFExceptionただし、課題を完了するためにこの方法でコーディングすることを余儀なくされる可能性があることに感謝します)。

最後に、例外が発生した場合でも、入力ストリームが閉じていることを確認する必要があります。Java 7 を使用している場合は、try-with-resources コンストラクトを使用すると、これが簡単になります。

于 2013-05-20T10:07:16.100 に答える