2016-07-30 34 views
0

Ich versuche, 'n' Bytes (serialisiertes Objekt) aus der Datei beginnend mit der Position 'i' zu lesen. Hier ist mein Code-Snippet,RandomFileAccess - java.io.StreamCorruptedException

public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchAlgorithmException { 
     String s = "XYZ"; 
     RandomAccessFile f = new RandomAccessFile("/home/Test.txt", "rw"); 
     f.write(s.getBytes()); 
     FingerPrint finger = new FingerPrint("ABCDEFG", "ABCD.com"); 
     Serializer ser = new Serializer(); 
     byte[] key = ser.serialize(finger);//Serializing the object 
     f.seek(3); 
     f.write(key); 
     byte[] new1 = new byte[(int)f.length()-3]; 
     int i=0; 
     for(i=3;f.read()!=-1;i++){ 
     f.seek(i); 
     new1[i]=f.readByte(); 
     } 
     FingerPrint finger2 = (FingerPrint) ser.deserialize(new1);//deserializing it 
     System.out.println("After reading:"+finger2.getURL()); 
} 

ich folgende Ausnahme erhalten,

Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 00000000 
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:807) 
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:302) 

Hier ist meine Serializer Klasse,

class Serializer { 

public static byte[] serialize(Object obj) throws IOException { 
    try(ByteArrayOutputStream b = new ByteArrayOutputStream()){ 
     try(ObjectOutputStream o = new ObjectOutputStream(b)){ 
      o.writeObject(obj); 
     } 
     return b.toByteArray(); 
    } 
} 

public static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException { 
    try(ByteArrayInputStream b = new ByteArrayInputStream(bytes)){ 
     try(ObjectInputStream o = new ObjectInputStream(b)){ 
      return o.readObject(); 
     } 
    } 
} 

}

Wenn ich nicht schreibe eine beliebige Zeichenfolge in die Datei und lese nur das Objekt, also von 0 bis eof, ich kann die Ausgabe sehen. Es gibt viele solche Fragen bereits gefragt, aber ich möchte wissen, warum es nicht funktioniert, wenn ich ein Objekt an einem bestimmten Ort schreibe und es zurück lese. Vielleicht mache ich etwas falsch, bitte teilen Sie Ihre Gedanken.

+0

lesen _ „ich etwas tue sein kann falsch“ _ - sehr wahrscheinlich. Hast du die Datei in einem Hex-Editor untersucht, um zu sehen, was du eigentlich geschrieben hast? –

+0

Neu in der Domäne. Danke für den Hexeditor..downloaded. – Anandan

+0

Das ist keine gute Idee. Für jedes Objekt, das Sie serialisieren, wird ein Serialisierungs-Stream-Header und Daten für jede beteiligte Klasse vorangestellt. Ihre Datei wird viel größer sein als Sie denken. Die Serialisierung ist seriell, kein zufälliger Zugriff. – EJP

Antwort

0

Hier ist Ihr Problem:

f.seek(3); 
    f.write(key); 
    byte[] new1 = new byte[(int)f.length()-3]; 
    int i=0; 
    for(i=3;f.read()!=-1;i++){ 
      ^^^^^^^^ 

An dieser Stelle der Dateizeiger bei EOF ist, da Sie nur die serialisierten Bytes geschrieben und haben nicht den Dateizeiger noch bewegt. Diese Schleife ist nicht erforderlich, sollten Sie seek(3) und dann direkt in new1 wie in

byte[] new1 = new byte[(int) f.length() - 3]; 
f.seek(3); 
f.read(new1); 
FingerPrint finger2 = (FingerPrint) ser.deserialize(new1);// deserializing