Probleme mit der Kodierung bei Streams

clupus

Grünschnabel
Hallo allerseits,

ich habe gerade mein Problem (provisorisch) gelöst, ich will aber wissen, warum das so ist und was ich tun kann um das zu vermeiden:

Ich will eine (auch binäre) Datei aus dem Netz mittels Java laden und in eine Datei speichern. Dazu habe ich zunächst eine Prüfung gemacht, mit welcher Kodierung die Daten geschickt werden (wenn's doch eine html-Datei sein sollte). Anschließend steht grob dieser Code:
Code:
File datei = (...);
Charset charset = (...);

FileOutputStream fout = new FileOutputStream(datei);
InputStreamReader ir;
OutputStreamWriter out;

ir = new InputStreamReader(con.getInputStream(), charset);
out = new OutputStreamWriter(fout, charset);

int val;
while ((val = ir.read()) != -1) {
	out.write(val);
}
ir.close();
out.flush();
out.close();

Wenn der Server keine Kodierung angibt (z.B. beim Laden einer binären Datei) muss ich ja einen default-Wert für charset geben.

Wenn ich hier den "richtigen" Wert (ISO-8859-1) einstelle, ist die Datei nach dem Download auch in Ordnung, sonst kommt da nur murks raus.
Das wundert mich leicht, da ich ja theoretisch zunächst im InputStreamReader dekodiere (also ISO -> UTF) und dann die Zeichen (deren int-Representation) wieder im OutputStreamWriter encodieren (UTF -> ISO).
Theoretisch müsste da doch am Anfang und am Ende das gleiche rauskommen unabhängig von der Kodierung, oder? Ich meine, die dekodierung wird ja im nächsten Schritt wieder rückgängig gemacht.

Theoretisch arbeitet Java ja intern mit UTF. Daher wollte ich eigentlich auf UTF als default stellen. Aber ich kann momentan nur ISO stehen lassen.

Was mache ich falsch/wo denke ich verquert?

Danke
Christian
 
Wenn du den Stream nur lesen und in eine Datei speichern willst, dann lass doch die Bytes so wie sie sind, ohne sie zu interpretieren.
 
Wenn du den Stream nur lesen und in eine Datei speichern willst, dann lass doch die Bytes so wie sie sind, ohne sie zu interpretieren.

Du meinst, ich soll ich soll keinen Reader bzw Writer verwenden, sondern die Streams direkt verarbeiten?
Weil wenn ich einfach nichts angebe beim ersetllen der Reader/Writer-Kombination, bekomme ich am Schluss eine fehlerhafte Datei.

Christian
 
Ich meine das so:

Java:
InputStream in = con.getInputStream();
byte [] buf = new byte[1024];

int val;
while ((val = in.read(buf)) != -1) {
	fout.write(buf);
}
in.close();
out.flush();
out.close();
 

Neue Beiträge

Zurück