Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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.
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.
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 ); }
}
Wie das? Es schreibt einen Identifier und die Properties. So ziemlich das gleiche, wie du händisch?
Sonst kannst du ja die Methoden zum lesen und zum Schreiben von der Serialisierung überschreiben.