# Einlesen von Text-Dateien & Zeichensatz bestimmen



## zer0 (17. Februar 2011)

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:


```
// 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?


----------



## XeoX (17. Februar 2011)

Ich empfehle dir zum lesne die Klasse Scanner:
Klasse Scanner

Da kannst du das Encoding einstellen welches du über die Klasse File bekommst:
Klasse FILE

Sonst immer ein GUTER Helfer:
Java API

Gruß XeoX


----------



## zer0 (17. Februar 2011)

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?


----------



## genodeftest (17. Februar 2011)

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


----------



## zer0 (17. Februar 2011)

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.


----------



## wakoz (17. Februar 2011)

mit getEncoding holst du (meines Wissens nach) nur den Zeichensatz des Stream bzw reader welchen du offen hast, nicht aber den des Dokuments.

Ich habe mal etwas gegooglet 

http://cpdetector.sourceforge.net/index.shtml
oder
http://www.java-forum.org/allgemeine-java-themen/95796-file-encoding-feststellen.html
vielleicht helfen dir die links weiter 

an der lösung bin ich auch interessiert


----------



## genodeftest (17. Februar 2011)

Stimmt, sorry.


----------



## zer0 (18. Februar 2011)

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ß


----------



## genodeftest (18. Februar 2011)

Wenn du nichts einfacheres findest, kannst du dir den Source Code von jEdit ansehen:
https://sourceforge.net/projects/jedit/develop
Die lesen solche großen Dateien aber scheinbar nicht ganz ein sondern in einen Puffer. Aber sie verwenden Swing zur Anzeige…


----------



## AttilaF (18. Februar 2011)

Meines Wissens nach für 1 Byte Zeichenkodierung (ANSI, latin) braucht man FileInputStream bzw. FileOutputStream.
z.B.

```
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("filename"),"Cp1252"))
```

Gruß Attila


----------



## wakoz (20. Februar 2011)

In den tiefen dieses Forums gefunden

Klick mich

habe es noch nicht ausprobiert, aber der User der angefragt hatte war sehr glücklich mit der Datei Encoding Erkennung.

kurze Erklärung.

Anfangs werden nur die ersten bytes ausgelesen, anhand dieser können bei vielen Dateien die Zeichen Sätze bestimmt werden.

im Anschluss wird ein reader erzeugt und dessen encoding wird auf den Zeichensatz des Dokuments gesetzt.


der source code bedarf aber etwas Überarbeitung
_______________________________________________________

hier gibt es ein Projekt welches sich mit dem erkennen von ecodings beschäftigt


----------



## benhaze (20. Februar 2011)

Beim Einlesen von Textdateien in ein Textpane, würde ich es so machen:


```
// Einlesen
            FileReader reader = new FileReader(file);
            BufferedReader in = new BufferedReader(reader);
 
            String line = "";
                
            while((line = in.readLine()) != null) {
                int len = jTextPane.getDocument().getLength();
                jTextPane.setCaretPosition(len);
                jTextPane.replaceSelection(line); //wenn cursor am Ende, dann String hinzufügen (also append, intern: document.insert !)
            }
            
            in.close();
```

den Code-Part dann in einen Thread und dabei zusehen wie das Textpane aus dem Dokument gefüllt wird. so fühlt es sich merklich performanter an...


----------

