2017-10-29 3 views
0

Ich versuche, eine ArrayList von benutzerdefinierten (serialisierbaren) Objekten in eine Datei zu schreiben/schreiben. Es funktioniert wie erwartet, bis auf eine Sache: Ich bekomme eine EOF-Ausnahme beim Lesen der Datei. Hier ist mein Code:Unerwartete EOF-Ausnahme

class FileHandler { 
    private final String FILENAME = "storage.txt"; 

    ArrayList<Plane> readFromFile(Context context) { 
     ArrayList<Plane> returnList = new ArrayList<>(); 
     Plane temp; 

     try { 
      FileInputStream fileInputStream = context.openFileInput(FILENAME); 
      ObjectInputStream objectInStream = new ObjectInputStream(fileInputStream); 


      while ((temp = (Plane)objectInStream.readObject()) != null) { 
       returnList.add(temp); 
      } 

      objectInStream.close(); 
     } 
     catch (IOException | ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 

     return returnList; 
    } 

    void writeToFile(ArrayList<Plane> inData, Context context) { 
     FileOutputStream fileOutputStream; 
     ObjectOutputStream outputStream; 

     try { 
      fileOutputStream = context.openFileOutput(FILENAME, Context.MODE_PRIVATE); 
      outputStream = new ObjectOutputStream(fileOutputStream); 

      for (Plane p: inData) { 
       outputStream.writeObject(p); 
      } 

      outputStream.close(); 
      fileOutputStream.close(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Die Datei wird geschrieben und gelesen, wie beabsichtigt, aber ich bin immer eine EOF Ausnahme, wenn die Datei zu lesen. Keine Ahnung warum. Ich dachte, meine While-Schleife würde sicherstellen, dass das nicht passieren kann?

  1. Warum bekomme ich diese Ausnahme?
  2. Ebene ist serialisierbar. Ist es möglich, die Datei zu lesen und in die Datei zu schreiben, wenn ich Plane stattdessen als Parcable ändere? (Wie?)

Antwort

0

Jeder Versuch, Objektdaten zu lesen, die die Grenzen der benutzerdefinierten Daten überschreitet durch die entsprechende Methode write geschrieben wird ein OptionalDataException verursachen mit einem EOF-Feld Wert true geworfen werden. Nicht-Objekt-Lesevorgänge, die das Ende der zugewiesenen Daten überschreiten, werden das Ende der Daten auf die gleiche Weise wie das Ende des Streams anzeigen: byteweise Lesevorgänge geben -1 zurück, wenn das Byte gelesen oder gelesen wird, und primitiv Lesevorgänge werden EOFExceptions auslösen. Wenn es keine entsprechende writeObject-Methode gibt, markiert das Ende der standardmäßigen serialisierten Daten das Ende der zugewiesenen Daten.

Dies ist, was ich auf https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html

Den letzten Versuch, Daten erfolgt zu lesen gefunden, wenn keine Daten vorhanden sind. Die While-Loop-Bedingung überprüft nicht wirklich, ob Daten zu lesen sind oder nicht. Es versucht, es unabhängig zu lesen.

+0

Wie führe ich eine solche Überprüfung durch? –

+0

https://stackoverflow.com/questions/2626163/java-fileinputstream-objectinputstream-reachs-end-of-file-eof Dies könnte nützlich sein – dhani