DataOutputStream übergeben

  • Themenstarter Themenstarter hk
  • Beginndatum Beginndatum

hk

Bekanntes Mitglied
Hallo Forum,
ich möchte binäre Daten (wie in DataOutputStream möglich) in einem Stream?? erstellen und sie dann einer anderen Klasse übergeben welche sie dann auch in eine Datei schreibt. Ich habe die Funktionen write.Int, write.Long, usw. in keinen anderen Stream gefunden.
lg heinz
 
Warum verwendest du dann nicht den DataOutputStream, wenn er genau das macht, dass du benötigst? Oder was ist dein eigentliches Problem (vl. mit einem kleinem Beispiel)?
 
Hallo Flown,
nun nach meinen Kenntnissen wird die Funktion dos.write.Int(99) ja sofort ausgegeben (in eine Datei geschrieben). Das will ich aber nicht, da ich eine zentrale Ausgabemethode habe. Vereinfacht dargestellt schreibe ich alles in einen String und sende diesen zur Ausgabemethode.
 
DataOutputStream schreibt in einen anderen OutputStream, nicht direkt in eine Datei.
Wenn du die Daten erst schreiben und dann noch im Programm rumreichen musst, kannst du die mit einem ByteArrayOutputStream in ein byte[] schreiben.
Das ganze in einen String schreiben macht wenig Sinn, binäre Daten sind kein String.


Statt einer "zentralen Ausgabemethode" gibts aber oftmals auch bessere Wege
 
ByteArrayOutputStream realisiert aber die binären Funktionen nicht. Es wird jeweils nur ein Byte des int geschrieben.
Ein besserer Weg wäre interessant.
 
Java:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
// ... benutze 'dos' um zu schreiben
// ... benutze 'baos' um die geschriebenen Bytes
// (innerhalb des ByteArrayOutputStreams) an andere Methoden zu übergeben.
// Diese können dann baos.toByteArray() aufrufen.
 
Ich gebe Datenstrukturen verschiedener Länge und Inhalt in eine Datei aus und möchte nicht für jede Datenstruktur eine Lese-, Schreibmetode erstellen.
Du hast jetzt doch trotzdem, wenn du an jeder Stelle ein DataOutputStream erstellst und dessen Ergebnis weitergibst 😉


Aber wie gesagt: wenn du von der zentralen Methode nicht weg möchtest, lass die entweder einen OutputStream zurückgeben oder gibt der Methoden, die jetzt den DataOutputStream erstellt, einfach einen Stream in den sie schreibt. Bei beiden vermeidest du das überfüssige Array als Buffer
 
Also so würde es funktionieren, aber es scheint nicht optimal zu sein?
Code:
        // Dieser Teil ist in mehreren Varianten vorhanden
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(baos);
        try {
        dos.writeInt(9999);
        dos.writeUTF("Text");
        dos.writeShort(8);
        } catch ( IOException e ) { System.err.println( e ); }
        satzSchreiben(baos);

     // Die zentrale Ausgabe-Methode
    private static void satzSchreiben(ByteArrayOutputStream baos) {
        long fileZeiger = 0l;
        long laenge;
        try {
        RandomAccessFile file = new RandomAccessFile("Test.dat", "rw" );
        fileZeiger = file.length();
        file.seek(fileZeiger);
        file.writeBytes(baos.toString());
        laenge =  (int) (file.getFilePointer() - fileZeiger);
        file.close();
        } catch (IOException e ) {  System.err.println( e );  }

        // Zur Prüfung Satz lesen
        try {
            RandomAccessFile file = new RandomAccessFile("Test.dat", "rw" );
            file.seek(fileZeiger);
            int i = file.readInt();
            String n = file.readUTF();
            short s = file.readShort();
            int c = 1;
             file.close();
        } catch (IOException e ) { System.err.println( e );  } 
    }
 
Warum eigentlich nicht einfach die Standard Java Serialisierung (oder andere Formen wie JAXB/JSON-B) verwenden? Da geht das doch gleich von alleine.
 

Neue Themen


Zurück
Oben