Serialisieren mit Progress

Kruemel

Mitglied
Guten Abend miteinander!

Normalerweiße findet man in google zu (fast) allem eine Antwort aber ich denke hier brauch ich fachmännische Hilfe ^^

Folgendes "Problem" oder eher Unklarheit:

Ich benutze eine Klasse "Message" in die ein String-Array und mehrere Byte-Arrays als Attachment gespeichert werden können.

Dieses Objekt soll über ein Socket serialisiert werden, klappt auch wunderbar.
Ich will den Fortschritt des Sendevorgangs grafisch ausgeben, also hab ich von FilterOutputStream und FilterInputStream abgeleitet um so die Bytes in einer extra Klasse Progress "mitzuzählen". Für den InputStream klappt das alles wunderbar, auch der OutputStream funktioniert soweit nur bremst er das ganze EXTREM aus. Normalerweiße findet die Serialisierung einer etwa 100mb großen Datei (auf die Festplatte) in weniger als einer Sekunde statt, mit dem ProgressOutputStream dauert es 10 Sekunden bis überhaupt ein Prozent der gesamten Bytes serialisiert wurde.

Ich dachte das Problem mit einem BufferedOutputStream vlt. lösen zu können und hab ihn so in die Streamkette eingefügt:

Java:
FileOutputStream fout = new FileOutputStream(new File("message.obj"));
ProgressOutputStream pos = new ProgressOutputStream(fout, p);	
BufferedOutputStream bos = new BufferedOutputStream(pos);		
ObjectOutputStream out = new ObjectOutputStream(bos);

Funktioniert genauso langsam, aber

Java:
FileOutputStream fout = new FileOutputStream(new File("message.obj"));
BufferedOutputStream bos = new BufferedOutputStream(fout);	
ProgressOutputStream pos = new ProgressOutputStream(bos, p);		
ObjectOutputStream out = new ObjectOutputStream(pos);

Funktioniert einwandfrei, zwar immer noch leicht zu langsam aber um ein vielfaches besser.

Warum ist das so? Ich denke, dass ich hier irgendwo eine Bremse reingehauen habe, die hätte ich gerne wieder weg.

Der OutputStream:
Java:
import java.io.*;

public class ProgressOutputStream extends FilterOutputStream{
	
	private Progress progress=null;
	
	public ProgressOutputStream(OutputStream out, Progress progress){
		super(out);
		this.progress=progress;
	}
	
	public synchronized void write(byte[] b, int off, int len) throws IOException{
		super.write(b, off, len);
		progress.update(len);
	}
}

Sorry für den Roman ^^ Ich hoffe es weiß jemand was hier falsch läuft.

Gruß,
Kruemel

P.S.: "Ganz normal senden" ohne Serialisierung u.s.w. funktioniert auch toll, ich weiß aber so eine Messageklasse in die man einfach alles reinpacken und senden kann ist viel komfortabler finde ich.
 
S

SlaterB

Gast
schau dir einfach den Quellcode an, FilterOutputStream write(Array) bringt das Kunststück zustande, in einer Schleife für jedes byte einzeln write() aufrufen, das Buffern ist komplett deaktiviert, alles wird einzein geschrieben
 
Zuletzt bearbeitet von einem Moderator:

Kruemel

Mitglied
Vielen Dank Slater B! Das war das Problem ^^ Wer denkt sich denn sowas aus.

Hab jetzt einfach den FilterOutputStream quasi nur noch als "Deko" um in der Klassenhierarchie drin zu sein, der Outputstream verschickt die Pakete jetzt einfach selbst ohne den super Aufruf.

Java:
public class ProgressOutputStream extends FilterOutputStream{
	
	private Progress progress=null;
	protected OutputStream out;
	
	public ProgressOutputStream(OutputStream out, Progress progress){
		super(out);
		this.out=out;
		this.progress=progress;
	}
	
	public synchronized void write(byte[] b, int off, int len) throws IOException{
		out.write(b, off, len);
		progress.update(len);
	}
	
	public synchronized void write(byte[] b) throws IOException{
		out.write(b);
		progress.update(b.length);
	}
	
	public synchronized void write(int b) throws IOException{
		super.write(b);
		progress.update(1);
	}
}

Vielen Dank!
Gruß, Kruemel

Edit:
Wäre es besser anstatt selbst den identischen Outputstream in out zu speichern, auf den des FilterOutputStreams, der gezwungenermaßen gesetzt werden muss, über super.out.write(...) zuzugreifen?
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Methoden Serialisieren Java Basics - Anfänger-Themen 17
H Interface Objekte speichern und laden (serialisieren/deserialisieren) Java Basics - Anfänger-Themen 1
J Serialisieren, aber wie? Java Basics - Anfänger-Themen 3
M Datum serialisieren Java Basics - Anfänger-Themen 1
M Serialisieren Java Basics - Anfänger-Themen 7
T Array serialisieren Java Basics - Anfänger-Themen 8
H Serialisieren Java Basics - Anfänger-Themen 9
E Serialisieren Java Basics - Anfänger-Themen 2
F Input/Output Serialisieren/Deserialisieren Java Basics - Anfänger-Themen 18
D Serialisieren, was bringt das? Java Basics - Anfänger-Themen 8
P Serialisieren-deserialisieren Java Basics - Anfänger-Themen 18
F Serialisieren Java Basics - Anfänger-Themen 35
D Serialisieren/deserialisieren Java Basics - Anfänger-Themen 37
S JFrame mit JTextPane serialisieren Java Basics - Anfänger-Themen 5
W Objekt (de-)serialisieren Java Basics - Anfänger-Themen 5
G Serialisieren mehrerer Objekte in EINE (XML)-Datei Java Basics - Anfänger-Themen 12
E ArrayList mit eigenen typ serialisieren? Java Basics - Anfänger-Themen 1
R Objecte Serialisieren / Deserialisieren Java Basics - Anfänger-Themen 2
S Klassen Serialisieren Java Basics - Anfänger-Themen 5
V Objekt serialisieren/Deserialisieren und per get verschicken Java Basics - Anfänger-Themen 5
J Serialisierung - Array-Objekt serialisieren/deserialisieren Java Basics - Anfänger-Themen 6
V Serialisieren einer ShortMessage (javax.sound.midi) Java Basics - Anfänger-Themen 5
M Serialisieren beim Schließen des Progs sicher beenden Java Basics - Anfänger-Themen 4
H Datei nach serialisieren leer ? Java Basics - Anfänger-Themen 10
G static var serialisieren möglich? Java Basics - Anfänger-Themen 4
Lulumann6 Serialisieren? Java Basics - Anfänger-Themen 9
artur.cichosz Objekt als String serialisieren Java Basics - Anfänger-Themen 7
M Problem beim Serialisieren Java Basics - Anfänger-Themen 7
S Generics serialisieren? Java Basics - Anfänger-Themen 2
C LinkedList serialisieren? Java Basics - Anfänger-Themen 22
G Color und String serialisieren Java Basics - Anfänger-Themen 2
G alle Instanzen einer Klasse serialisieren Java Basics - Anfänger-Themen 4
C Mehrere Objekte in einer Liste einfügen und serialisieren Java Basics - Anfänger-Themen 1
S Vector serialisieren Java Basics - Anfänger-Themen 4
C Objekt serialisieren Java Basics - Anfänger-Themen 5
N wert für progress auf 100% setzen Java Basics - Anfänger-Themen 5
T Progress Bar Java Basics - Anfänger-Themen 20
B Progress Bar Updaten Java Basics - Anfänger-Themen 4
G Daten laden - progress Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben