2016-04-30 4 views
0

Ich schreibe mehrere serialisierbare Java-Objekte auf Band.Objekt von nicht zurückgespultem Band lesen

Der Code funktioniert ohne Probleme beim Lesen der geschriebenen Objekte mit einem Rückspulgerät (/ dev/st0), aber es ist nie erfolgreich beim Lesen dieser Objekte mit einem nicht zurückspulenden Gerät (/ dev/nst0).

Der Fehler tritt immer im ersten readObject() -Aufruf auf und gibt eine StreamCorruptedException zurück.

BufferedInputStream bis = new BufferedInputStream (
     new FileInputStream(device), 2*1024*1024); 
ObjectInputStream ois = new ObjectInputStream(bis); 
Object oisObject = ois.readObject(); 

Die Ausnahme: Fehlermeldung und relevanter Stack-Trace ist:

java.io.StreamCorruptedException: invalid stream header: 9AF03B07 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299) 

ist zuversichtlich, dass jemand in der Lage sein könnte, mir zu helfen, zu verstehen, warum dies nur mit dem nicht zurückspulende Gerät auftritt, ist, und vielleicht schlagen auch eine mögliche Abhilfe für das Problem vor. Vielen Dank.

+0

Haben Sie irgendwie verifiziert, dass das Lesen im Allgemeinen von diesem Gerät aus funktioniert, indem Sie einfach eine Tonne Bytes mit einem normalen Ausgabestrom in das Gerät schreiben und es mit einem Eingabestream erneut einlesen? – Harald

+0

Ja, die Validierung der Infrastruktur ist ein Muss. In diesem Fall funktionieren das Bandlaufwerk und die Gerätedateien ordnungsgemäß unter Verwendung von Linux-Befehlen und Java-Eingabe/Ausgabe-Streams. Das Problem scheint derzeit auf readObject() und nur über ein nicht zurückgespultes Gerät isoliert zu sein. – Brett

+0

Fehlermeldung und Stack-Ablaufverfolgung fehlen beide von dieser Frage. – EJP

Antwort

0

Beachten Sie, dass die Ausnahme von new ObjectInputStream() ausgelöst wird, und die Hex-Zahl teilt Ihnen mit, wie die ersten vier Bytes dieses Streams waren. Dies bedeutet, dass alles, was in diesem Gerät ist, nicht mit einer ObjectOutputStream beginnt.

+0

Vielen Dank für die Korrektur, wo die Exception geworfen wird, sowie die Information über die zusätzlichen Bytes in der Fehlermeldung. Nachdem ich zusätzliche und komplexere Testfälle erstellt habe, kann ich den Fehler immer noch nicht außerhalb der Anwendung reproduzieren. Da dieser Code mit "st0" für "years" [link] (https://community.oracle.com/thread/1144817) funktioniert und auch weiterhin einwandfrei funktioniert (danke für die frühere Hilfe, btw), komme ich wieder auf was zurück könnte möglicherweise mit "nst0" anders sein? Irgendwas mit dem Dateizeiger? Ich kann entweder mit st0/nst0 schreiben, kann aber nur mit st0 zurücklesen. – Brett

+0

Gefunden in meinem Code ein früherer "Blick" auf die Objekte, damit erklärt, warum nur das nicht zurückspulende Gerät die Ausnahme warf. Oh, die Schande ... :) – Brett