ObjectOutputStream oder ObjectInputStream fehlerhaft?

Ph3n1x

Mitglied
Hallo Leute,

ich finde meinen Fehler nicht :(

Ich möchte ein byte[] in eine Datei schreiben und es anschließend wieder daraus lesen. Beim Lesen entsteht aber plötzlich ein anderes byte[] als ich geschrieben habe.

Hier ein vereinfachtes Beispiel, wo der selbe Fehler auftritt. Würde alles richtig arbeiten, würden die Ausgaben die selben sein, was aber nicht der Fall ist.
Um den Hashwert zu berechnen könnt ihr auch einen anderen Weg nutzen, ich bin hier über die bouncycastle Bibliothek gegangen.

Java:
import java.io.*;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.security.MessageDigest;
import org.bouncycastle.util.encoders.Hex;

/**
 *
 * @author Marcel Carlé <mc@marcel-carle.de>
 */
public class Tester {

    public static void main(String[] args) throws Exception {

        byte[] data = openFile();

        // Erstelle Datei zum schreiben
        FileOutputStream fos = new FileOutputStream(new File("test"));
        ObjectOutputStream oosf = new ObjectOutputStream(fos);
        // Schreibe byte[]-Länge und anschließend das Array selbst
        oosf.writeInt(data.length);
        oosf.write(data);

        // Speichere Datei
        fos.flush();
        fos.close();

        // Gebe den Hashwert des byte[]-Arrays aus
        try {
            final MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
            messageDigest.reset();
            System.out.println(new String(Hex.encode(messageDigest.digest(data))));
        } catch (Exception e) {
        }

        // Öffne die gerade geschriebende Datei
        FileInputStream fis = new FileInputStream(new File("test"));
        ObjectInputStream ois = new ObjectInputStream(fis);

        // Lese zunächst die Länge des kommenden byte[]
        int length = ois.readInt();
        byte[] dataRead = new byte[length];
        // ... und anschließend das byte[]
        ois.read(dataRead);

        
        // Gebe den Hashwert des byte[]-Arrays aus
        try {
            final MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
            messageDigest.reset();
            System.out.println(new String(Hex.encode(messageDigest.digest(dataRead))));
        } catch (Exception e) {
        }
    }

    private static byte[] openFile() throws Exception {
        // Lade Datei herunter
        URL website = new URL("http://www.marcel-carle.de/assets/Cryptonify/Cryptonify-1.7.8.zip");
        ReadableByteChannel rbc = Channels.newChannel(website.openStream());
        FileOutputStream fos2 = new FileOutputStream("tmp");
        fos2.getChannel().transferFrom(rbc, 0, 1 << 24);
        fos2.flush();
        fos2.close();

        // Öffne heruntergeladene Datei
        File selectedFile = new File("tmp");
        FileInputStream fis1 = new FileInputStream(selectedFile);
        byte[] data = new byte[(int) selectedFile.length()];
        fis1.read(data);
        fis1.close();
        // Gebe byte[] der heruntergeladenen Datei zurück
        return data;
    }
}

Findet jemand meinen Fehler, oder liegt der Fehler in Java selbst?

Danke schon mal für die Unterstützung!
Grüße
Ph3n1x
 

xehpuk

Top Contributor
Wozu verwendest du diese beiden Klassen überhaupt, wenn du eh nur ein
Code:
byte[]
schreiben und lesen willst?
 

Chumax

Aktives Mitglied
Du solltest nur 1 Object in dem File speichern. Sonst bekommst du Probleme.

Eine ArrayList ist auch 1 Object.

mfg Christian
 

Ph3n1x

Mitglied
oosf.flush();
oosf.close();
!?

Hattest doch recht :oops: Hab deinen Vorschlag nur im hier geschriebenen Beispiel probiert und dort machte es keinen Unterschied. In meinem eigentlichen Programm ist das die Lösung!

Hier funktioniert es dann trotzdem nicht, da ich vergessen habe ein readFully() statt ein read() zu machen :D

Danke Leute!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Input/Output ObjectOutputStream - Problem Allgemeine Java-Themen 7
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
Seikuassi Input/Output ObjectOutputStream putFields-Problem Allgemeine Java-Themen 2
B ObjectOutputStream verzeichnis wählen Allgemeine Java-Themen 8
G ObjectOutputStream Allgemeine Java-Themen 15
S ObjectOutputStream / objekte anhängen Allgemeine Java-Themen 2
T ObjectOutputStream#writeObject() zu langsam. Allgemeine Java-Themen 13
S ObjectOutputStream Allgemeine Java-Themen 12
R ObjectOutputStream Allgemeine Java-Themen 5
T ObjectOutputStream => Socket versenden Allgemeine Java-Themen 2
S ObjectOutputStream Allgemeine Java-Themen 2
U ObjectOutputStream Allgemeine Java-Themen 14
O Auslesefehler beim ObjectInputStream(Array) Allgemeine Java-Themen 6
K Input/Output ObjectInputStream.HandleTable OutOfMemory Allgemeine Java-Themen 8
P ObjectInputStream kann nicht vernünftig lesen... Allgemeine Java-Themen 9
T ObjectInputStream - Arrayliste, die unbekannte Objekte enthält Allgemeine Java-Themen 9
T Klasse in externer JAR mit ObjectInputStream Allgemeine Java-Themen 14
B ObjectInputStream - Wann ist Ende erreicht? Allgemeine Java-Themen 10
J ObjectInputStream und OutOfMemory Allgemeine Java-Themen 10
Tommy Nightmare String.replaceAll(...) fehlerhaft? Allgemeine Java-Themen 3
K Eclipse compiled .Jar - Fehlerhaft? Allgemeine Java-Themen 2
E AES Entschlüsselung teilweise fehlerhaft Allgemeine Java-Themen 5
D Programm läuft fehlerhaft, finde den Fehler nicht Allgemeine Java-Themen 6
C Prüfen auf Zahl und 6 stellig fehlerhaft? warum? Allgemeine Java-Themen 7
K import- Anweisung fehlerhaft und andere Fehler (eclipse) Allgemeine Java-Themen 2
X Konsolenausgabe fehlerhaft Allgemeine Java-Themen 9
S Eclipse zeigt build.xml immer als fehlerhaft Allgemeine Java-Themen 12
D java.lang.Math fehlerhaft? Allgemeine Java-Themen 18

Ähnliche Java Themen

Neue Themen


Oben