2017-01-15 10 views
1

Ich stieß auf ein seltsames Problem, das ich anscheinend nicht verstehe. Ich mache ein Programm, das Daten aus einer Datei liest. Aber wenn ich Daten lese, erhalte ich sofort eine EOFException.FileInputStream.available() gibt Bytes zurück, aber ObjectInputStream.available() gibt 0 zurück

Also überprüfte ich mit. Available(), wenn die Datei leer war oder nicht. Und ich habe ein komisches Ergebnis bekommen. Der FileInputStream sagte, dass die Datei gefüllt war (249 Bytes), aber der ObjectInputStream sagte, dass die Datei leer ist (oder nicht gelesen werden kann).

EOFException um: "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(); 

EDIT: Ich bin das Hinzufügen von Inhalten in die Datei wie folgt aus:

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

Antwort

1

Hier ist, was die javadoc sagt

Jeder Versuch, Objektdaten zu lesen, die die Grenzen überschreitet der Die benutzerdefinierten Daten , die von der entsprechenden writeObject-Methode geschrieben werden, bewirken, dass eine OptionaleDataException mit einem eof-Feldwert true ausgelöst wird. Nicht-Objekt-Lesevorgänge, die das Ende der zugewiesenen Daten überschreiten, werden das Ende der Daten auf dieselbe Weise widerspiegeln, wie sie das Ende des Datenstroms anzeigen würden: byteweise Lesevorgänge geben -1 als Byte zurück oder Anzahl der Bytes lesen, und primitive Lesevorgänge werden EOFExceptions auslösen. Wenn keine entsprechende writeObject-Methode vorhanden ist, kennzeichnet das Ende der standardmäßigen serialisierten Daten das Ende der zugewiesenen Daten.

Außerdem müssen Sie das Objekt Eingabestrom in der gleichen Reihenfolge zu lesen, wie wenn Sie es serialisiert

+0

Ich habe meine Frage bearbeitet. Jetzt können Sie sehen, in welcher Reihenfolge ich die Datei befülle. – Guido

+2

Ihre Leseaufrufe entsprechen nicht einmal den Schreibaufrufen. Ihr erster Schreibaufruf ist ein Objekt, aber Ihr erster Lesevorgang ist ein int – Biu

+0

Wow, das habe ich nicht einmal bemerkt. Vielen Dank! – Guido

Verwandte Themen