2011-03-07 15 views
6

Aşağıdaki kod bir EOFException üretir. Neden?Java readObject ile Gizemli EOF istisnası

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(); 
      } 
     } 

StackTrace:

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 
+2

Javadoc: 'bir OptionalDataException neden olur karşılık gelen writeObject yöntemi tarafından yazılan özel verileri sınırları aşan bir amacı veri okumak için herhangi bir teşebbüs TRUE – malinois

+0

bir EOF alanı değeri ile atılmak üzere evet zaten okuma ama nasıl önlenir? –

cevap

9

dosya içerir kaç nesneleri bağlıdır. Tek bir nesneyi varsa, bir adımda altüst edebilirsin.

try { 
    Object temp = ois.readObject(); 
} 
catch(Exception e) { 
    //handle it 
} 
+2

evet ama hata EOF atar .. neden? –

+0

, yığın izini yakından izleyin. –

+6

@Aizaz: readObject() 'in, dosyanın sonunda null değerini döndürmesini neden bekliyorsunuz? Olmaz, her zaman nesneyi döndürmek veya bir istisna atmak için belirtilir. Bu yüzden, 'null' dizisini açıkça serileştirmediyseniz, 'readObject() 'nı' null' döndürmesini beklememelisiniz. –

2

ObjectInputStream üzerinde readObject() tanımı akışının sona erdiğinde bu null döneceğini belirtmez. Bunun yerine, dosyanın sonundan başka bir nesne okumayı denerseniz, bir istisna atılır. Bunu oluştururken akışına null yazdıysam tüm

+0

sonra dosya sonunda ne olduğunu tespit etmek? EOF istisnasını nasıl önleyebilirim? –

+0

Kaç tane nesnenin bekleyeceğini veya EOF istisnasının düzgün bir şekilde işleneceğini söyleyen dosyada bilgi depolayın. Özel durumların mutlaka 'başarısızlık' olmadıklarını unutmayın, ancak durum değişikliklerini yığına kadar yaymanın bir yolu olarak kullanılabilir. – AndyT

+0

@Aizaz: * catch * it! – EJP

4

Öncelikle readObject() sadece null döndürür. Akışta daha fazla veri yoksa, bir EOFException atar.

EOF'yi beklemiyorsanız, bunun nedeni muhtemelen akış bozuktur. Verileri yazdıktan sonra kapatmayı unutursanız bu durum gerçekleşebilir.

+0

sonra dosya sonunda nasıl algılandı? EOF istisnasını nasıl önleyebilirim? –

+4

@Aizaz: EOFException bunu size söyler.Kontrol edilen istisna, kontrol akışı için yakalanıp incelenmelidir. Hata değil, ek dönüş kodları. Ara sıra. Doğru kullanıldığında. Çoğu IOExceptions için durum böyle değil. Ancak EOFException için doğru. ... Ahem. Başka bir çözüm, nesnelerin sayısından önce nesnelerin sayısını akışa yazmaktır, böylece bilinen sayıda döngü yapabilirsiniz. Ya da nesneleri bir konteynere bir liste veya bir dizi gibi koyun ve yerine kabı yükleyin. –

+0

Doğru cevap olduğunu düşünüyorum: @Aizaz - readObject() tüm dosyayı bir kerede okuyacaktır ve sizin için yeniden seri hale getirecektir. Sadece bir kez değil, bir döngüde aradığınızdan emin olun. - adarshr 18 saat önce –

5

Aynı gizemli EOFException vardı ve ObjectInputStream için ObjectOutputStream üzerinden göndermek için yalnızca Object Class yoluydu. Aynı yola sahip olmalıdırlar (aynı paket adı ve elbette aynı sınıf adı).