FileReader und Filewriter

localhost1

Mitglied
Grüß Euch, frohes Neues erstmal.


Ich "spiele" momentan mit Dateien lesen und schreiben in Java. Bei einigen Projekten macht der Code nicht das was er soll - ohne Fehlermeldung. Sehr nervig, ich komme nicht weiter, konnte das Problem aber isolieren.

Hier an einem Beispiel:
Ich lese eine Datei ein und schreibe diese unverändert wieder. Das funktioniert nicht so wie gedacht


Java:
FileReader in = new FileReader("C:\\test\\testdatei.zip");
		FileWriter out = new FileWriter("C:\\test\\ausgabedatei.zip");

		BufferedReader br = new BufferedReader(in);
		
		String s;
		String end = "";
		while((s = br.readLine()) != null)
		{ 
			end+=s; 
		} 
		br.close();
		
		int length=end.length();
		
		char c[]=new char[length];
		
		for(int i =0;i<length;i++)
		{
			c[i]=end.charAt(i);
			out.write(c[i]);
		}

		out.flush();
		out.close();
		
	}

meinem Verständnis nach sollte die Datei gelesen werden und unverändert wieder ausgespuckt werden.

Ergebnis nach Ausführung:
Meine Testdatei ist 5674 bytes groß. Sie wird gelesen (length wenn ich ausgebe ist auch 5674) und in ausgabedatei geschrieben. Die Ausgabedatei ist 5629 Bytes groß, auch kann ich das zip nicht öffnen um die Textdatei darin auszuspucken.


Mein Problem:

Wieso produziert obiger Code nicht exakt dieselbe Datei wie beim Einlesen?


Vielen Dank!
 
eine byte-Folge darf nie als String eingelesen werden, dabei geht alles kaputt,
warum kann ich wieder einmal nicht erinnern, aber ist ja auch egal,

kein FileReader/Writer, kein BufferedReader, FileInputStream & Co. sind angesagt und byte[] statt Strings,

----

übrigens kann String + Zeile in einer Schleife ganz schön langsam werden falls es eine MB-große tatsächliche Textdatei mit tausenden Zeilen ist,
StringBuilder wäre da immens schneller, aber hier eh auch nicht geeignet
 
übrigens kann String + Zeile in einer Schleife ganz schön langsam werden falls es eine MB-große tatsächliche Textdatei mit tausenden Zeilen ist,
StringBuilder wäre da immens schneller, aber hier eh auch nicht geeignet

danke erstmal, ich werds baldigst testen.

Ich habe in der Tat mehrere MB große Dateien zum einlesen, ich habe schon gemerkt dass dieses String+= sehr langsam wird.

Gibts Alternativen?

Ich möchte eine Datei einlesen, möglichst Zeichenweise. Diese Zeichen möchte ich dann wieder schreiben, eventuell vorher noch bearbeiten (Stichwort Ver- und Entschlüsseln)

Wenn es andere Wege als den meinen gibt bin ich offen für Vorschläge
 
eine byte-Folge darf nie als String eingelesen werden, dabei geht alles kaputt,
warum kann ich wieder einmal nicht erinnern, aber ist ja auch egal,

ach übrigens: Hab ich im Internet gefunden, ist von 2003 der Beitrag aber wohl immer noch aktuell:

"Ein FileInputStream hat InputStream als Superklasse und liest bytes aus einem File, während FileReader die Superklasse Reader hat und char(acter) aus einem File liest.

Diese Unterscheidung zwichen byte und char ist u.a. auch deswegen nötig, da Java char(acter) als Unicode(=2Byte) und nicht als ASCII-Code(=1Byte) handhabt.Als "Brücke" von byte nach char kann die Klasse InputStreamReader dienen."
 
einen anderen habe ich genannt, findest du überall
Java Copy File Example, Copy File in Java
(wobei erst der dritte Link, die ersten beiden noch mit Reader/ Writer..)

spätestens wenn du auch nach Verschlüsselung suchst dürfte byte-Orientierung überwiegen
Encrypting a File or Stream with DES | Example Depot

zu bytes vs chars wären grundsätzliche Tutorials wie
I/O Streams (The Java™ Tutorials > Essential Classes > Basic I/O)
angesagt

-----

> Ich möchte eine Datei einlesen, möglichst Zeichenweise.
öffne mal ein Zip mit einem Editor, du hast dort byte-Kauderwelsch, keine Zeilen,
überhaupt einen als Zeilenumbruch interpretierten char zu finden, wenn ungünstigerweise in chars umgewandelt, dürfte reine Glückssache sein,

bei bytes gibts keine derartigen Umbrüche, man liest immer konstante Blücke von z.B. 8192 bytes ein, usw.
 

Zurück
Oben