Einlesen von Text-Dateien & Zeichensatz bestimmen

zer0

Erfahrenes Mitglied
Ich benutze zum Einlesen von Text-Dateien den FileReader und BufferedReader. Danach setz ich den eingelesenen String in ein JTextPane. Bei mittelgroßen Dateien dauert es schon spürbar lange. Was ist den die übliche Variante um Text-Dateien einzulesen bzw zu schreiben, also welcher Reader/Writer/Stream.

Mein Code sieht so aus:

Java:
			// Einlesen
			FileReader reader = new FileReader(file);
			BufferedReader in = new BufferedReader(reader);

			StringBuilder builder = new StringBuilder();
			String line = "";
				
			while((line = in.readLine()) != null) {
				builder.append(line);
				builder.append("\n");
			}
			
			in.close();
			
			String text = builder.toString();
			// Letztes Newline Zeichen abschneiden
			text = (text.length() > 0) ? text.substring(0, text.length() - 1) : "";
			textPane.setText(text);

			// Schreiben
			String text = textPane.getText();
			
			FileWriter writer = new FileWriter(getFile());
			BufferedWriter out = new BufferedWriter(writer);
			out.write(text);
			
			out.close();

Ausserdem habe ich ein Problem beim darstellen der Dateien im JTextPane, den ich kenne das Encoding der Datei ja nicht, und weiß somit nicht wie ich Sie darstellen soll?
 
Zuletzt bearbeitet:
Warum die Klasse Scanner? Ist sie schneller, oder was spricht gegen meine Methode?

Ich will nicht das Encoding der Datei einstellen, sondern es ermitteln und den Text mit dem richtigen Encoding in dem JTextPane darstellen.
Ermitteln kann ich das Encoding mit FileReader.getEncoding(), aber obwohl ich eine UTF8 Kodierte Datei einlese, werden die Umlaute als Viereck dargestellt.

Was muss ich machen?
 
Dass es "lange" dauert, ist klar wenn du mit Strings arbeitest. In Java gilt allgemein, dass Strings sehr Performancehungrig sind – unter anderem weil sie "immutable" sind, d.h. jedes mal wenn du an einem String etwas änderst, wird ein neuer erzeugt.

Nebenbei: JTextArea ist ein bisschen performanter als JTextPane

Beispiele gibts genug, eine Suche liefert z.B.:
http://java2everyone.blogspot.com/2009/01/open-text-file-into-jtextarea.html
 
Das String's immutable sind weiß ich. Deswegen habe ich den StringBuilder benutz ;) Der ist um einiges Perfomanter als die Methode, die in dem von dir geposteten Link verwendet wird um eine Datei einzulesen. Den dort wird IMMER ein neuer String erzeugt.

JTextArea bietet mir nicht die Funkionalität die ich brauche.
 
Das mit getEnconding() wusste ich nicht, danke dafür! :)

Wenn der Text zunächst falsch dargestellt wird ist kein Problem. Ich möchte aber das der Text dann in verschieden Encodings im JTextPane dargestellt wird. Mit String.gteBytes("Charset"); hat's nicht so ganz funktioniert, muss ich noch etwas beachten, oder ist mein einlesen der Datei vllt schon falsch?

Gruß
 
Meines Wissens nach für 1 Byte Zeichenkodierung (ANSI, latin) braucht man FileInputStream bzw. FileOutputStream.
z.B.
Java:
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("filename"),"Cp1252"))

Gruß Attila
 
Zurück