Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [JAVA] DeflaterOutputStream-Problem....



Lin728
29-07-2003, 12:43
Ich habe ein Problem mit dem DeflateOutputStream:

Damit die Daten sofort und nicht erst in 32k-Blöcken geschrieben werden, die man in einen DeflateOutputStream geschrieben hat, muss man auf dem Stream-Object die Methose finish() ausführen.

Laut Sun-Doku schreibt diese Methode alle noch nicht geschriebenen Daten hinaus, und schließt den Stream, im Gegensatz zu .close() bleibt der darunterliegende Stream aber offen.

Mein Code sieht vereinfach so aus:



DeflaterOutputStream dos = new DeflaterOutputStream(os);
String befehl = "calendar:35:"+weeks+"\n";
dos.write(befehl.getBytes());
dos.finish();
os.flush();

DeflaterOutputStream des = new DeflaterOutputStream(os);
String befehls = "calendar:35:"+1+"\n";
des.write(befehls.getBytes());
des.finish();
os.flush();

Jetzt habe ich das Problem, dass das erste write auf dos noch funktioniert,bei des funktioniert es nicht mehr, auf jeden Fall erhält der BufferedReader auf "der anderen Seite" (sowieso alles auf lokalhost) nichts mehr.

Auf der anderen Seite habe ich einen BufferedReader, der so erzeugt wurde:
BufferedReader r = new BufferedReader(new InputStreamReader(new InflaterInputStreamreader(socket.getInputStream()) );

Nachdem ich zum ersten mal finish() auf einen DeflaterOutputStream aufgerufen habe, liefert bufferedReader.readLine() nur noch null-Strings anstatt zu blocken.

Hier das Lesen des BufferedReaders


while(!line.equals("quit"))
{
line = br.readLine();
if(line!=null)
{
System.out.println(line);
serverParser.readRequest(line);
}
}



Danke

peschmae
29-07-2003, 16:28
hab n bisschen rumgebastelt

von wegen mehrere OutputStreams schreiben auf einen und so - aber irgendwie kam ich dem problem nicht auf die Spur

bin genau so ratlos wie du :(

MfG Peschmä

anda_skoa
29-07-2003, 16:57
Hmm, reicht nicht einfach flush() alleine?

Bzw, bist du sicher, dass close() den darunterliegenden Stream auch schliesst?

Ciao,
_

peschmae
29-07-2003, 19:52
zu close:

in der APIDoc zu OutputStream ist das nicht festgenagelt - es steht einfach, dass der Stream geschlossen und die von ihm benutzten ressourcen freigegeben werden

bei DeflaterOutputStream steht aber:


void close()
Writes remaining compressed data to the output stream and closes the underlying stream.


recht inkonsistent irgendwie :o :o :o

MfG Peschmä

Lin728
29-07-2003, 21:40
Hab jetzt einmal auf google/groups gesucht und da hab ich ziemlich viele Leute mit diesem Problem gefunden, aber nur eine Lösung dazu:

Eine "lightweight" Kompressionsbibliothek zu verwenden, da der DeflaterInputStream sowas nicht kann. Es gibt schon Bugreports bei Sun

Lg