# Datenströne - Text in eine Datei einlesen, umwandeln und in eine neue Datei schreiben



## Sophie (22. Apr 2011)

Hallo Zusammen

Ich versuche eine Aufgabe zu lösen, bekomme aber den letzten Teil nicht hin:

Speichern Sie sich die Datei datei1702_vor.html lokal auf Ihrem Rechner.
Schreiben Sie ein Programm HtmlConv.java, welches die folgenden Aufgaben erfüllt:

Einlesen der Daten aus der Datei datei1702_vor.html
      Durchsuchen der eingelesenen Zeichen nach den
      Umlauten "ä", "Ä", "ö", "Ö", "ü", "Ü" und dem scharfen S "ß"
       Ersetzen der gefundenen Zeichen durch die speziell dafür vorgesehenen Zeichen "&auml;",       
           "&Auml;", "&ouml;", "&Ouml;", "&uuml;", "&Uuml;" und "&szlig;"
       Schreiben der Zeichen einschließlich der geänderten in die Datei datei1702_nach.html

Das einlesen und umwandeln funktioniert, die neue Datei wird auch erstellt, ist aber leer.

Weiss jemand, warum der neue Text nicht in die Datei geschrieben wird?

Hier mein Quellcode;

```
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;


public class HtmlConv {

	/**
	 * @param args
	 * @throws IOException
	 */
	
	public static void main(String[] args) throws IOException {

		// Dateiname der einzulesenden Datei
		String pfad = "C:/Users/Sophie/Desktop/datei1702_vor.html";

		// Methode zum Einlesen der Datei aufrufen
		DateiEinlesen(pfad);
	}
	/**
	 * Methode zum Einlesen der Datei
	 * 
	 * @param pfad
	 * @throws IOException
	 */
	public static void DateiEinlesen(String pfad) throws IOException {

		// Drei Eingabeströme erzeugen und mit der Datei verbinden
		FileInputStream fis = new FileInputStream(pfad);
		InputStreamReader isr = new InputStreamReader(fis);
		BufferedReader br = new BufferedReader(isr);

		// Alle Zeilen aus der Datei lesen und zur Standardausgabe ausgeben
		String eineZeile;
		while (br.ready()) {
			eineZeile = br.readLine();
			
		//Methode zum suchen und ersetzen der Umlaute aufrufen	
			UmlauteSuchenUndErsetzen(eineZeile);
		}
		// Ausgabestrom schliessen
		br.close();
	}
	/**
	 * Methode zum Durchsuchen der eingelesenen Zeichen nach den Umlauten "ä",
	 * "Ä", "ö", "Ö", "ü", "Ü" und dem scharfen S "ß" und Ersetzen der
	 * gefundenen Zeichen durch die speziell dafür vorgesehenen Zeichen
	 * "&auml;", "&Auml;", "&ouml;", "&Ouml;", "&uuml;", "&Uuml;" und "&szlig;"
	 * 
	 * @throws IOException
	 */
	public static void UmlauteSuchenUndErsetzen(String eineZeile)
			throws IOException {

		eineZeile = eineZeile.replace("ä", "&auml").replace("Ä", "&Auml")
				.replace("ö", "&ouml").replace("Ö", "&Ouml")
				.replace("ü", "&uuml").replace("Ü", "&Uuml")
				.replace("ß", "&szlig");

		//Methode zum erzeugen und schreiben in die neue Datei aufrufen
		InDateiSchreiben(eineZeile);
	}
	/**
	 * Methode zum Schreiben der Zeichen einschließlich der geänderten in die
	 * Datei datei1702_nach.html
	 * 
	 * @throws IOException
	 */
	public static void InDateiSchreiben(String eineZeile) throws IOException {

		// Dateiname der neuen Datei
		String datei = "C:/Users/Sophie/Desktop/datei1702_nach.html";

		// Eine Datei und drei Ausgabeströme erzeugen und miteinander verbinden
		FileOutputStream fos = new FileOutputStream(datei);
		OutputStreamWriter osw = new OutputStreamWriter(fos);
		BufferedWriter bw = new BufferedWriter(osw);

		//Text in die neue Datei schreiben
		bw.write(eineZeile);
		bw.newLine();
		bw.close();
	}
}
```


----------



## javv (22. Apr 2011)

ja, jedes mal wird eine neuer Stream geöffnet, wenn die Methode betreten wird. Solche Streams könnten besser Attribute sein. Aber besser ist es noch, man schreibt die Ein- und Ausgabe innerhalb einer Methode.


----------



## Sophie (25. Apr 2011)

Hallo

Ich habe das jetzt mal alles in eine Methode gepackt, die neue Datei ist jedoch immernoch leer.
Woran liegt das denn? Ich kann den Fehler nicht finden.

Gruss
Sophie

```
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;


public class HtmlConv {

	/**
	 * @param args
	 * @throws IOException
	 */
	
	public static void main(String[] args) throws IOException {

		// Dateiname der einzulesenden Datei
		String pfad = "C:/Users/Sophie/Desktop/datei1702_vor.html";

		// Methode zum Einlesen der Datei aufrufen
		DateiEinlesen(pfad);
	}
	/**
	 * Methode zum Einlesen der Datei
	 * 
	 * @param pfad
	 * @throws IOException
	 */
	public static void DateiEinlesen(String pfad) throws IOException {

		// Drei Eingabeströme erzeugen und mit der Datei verbinden
		FileInputStream fis = new FileInputStream(pfad);
		InputStreamReader isr = new InputStreamReader(fis);
		BufferedReader br = new BufferedReader(isr);

		// Alle Zeilen aus der Datei lesen und zur Standardausgabe ausgeben
		String eineZeile;
		while (br.ready()) {
			eineZeile = br.readLine();
			
     		eineZeile = eineZeile.replace("ä", "&auml").replace("Ä", "&Auml")
				.replace("ö", "&ouml").replace("Ö", "&Ouml")
				.replace("ü", "&uuml").replace("Ü", "&Uuml")
				.replace("ß", "&szlig");


		// Dateiname der neuen Datei
		String datei = "C:/Users/Sophie/Desktop/datei1702_nach.html";

		// Eine Datei und drei Ausgabeströme erzeugen und miteinander verbinden
		FileOutputStream fos = new FileOutputStream(datei);
		OutputStreamWriter osw = new OutputStreamWriter(fos);
		BufferedWriter bw = new BufferedWriter(new FileWriter("C:/Users/Sophie/Desktop/datei1702_nach.html"));

		//Text in die neue Datei schreiben
	
		bw.write(eineZeile);
		bw.close();
	}
}}
```


----------



## Volvagia (25. Apr 2011)

Du wirst damit immer die vorherigen Zeilen in der Ausgabe übschreiben, öffne den Stream am Anfang vor dem Lesen und schließe ihm nach der while. Vorm close sollte auch noch flush() aufgerufen werden. 
Ein System.out.println, um den Text zu kontrollieren ist auch niemals falsch.


----------



## Sophie (25. Apr 2011)

Das verstehe ich nicht. 
Ich habe jetzt am Ende noch eine Ausgabe auf der Konsole eingegeben, dort erscheint der Text umgewandelt, er wird jedoch nicht in die Datei geschrieben.

Was soll ich genau nach while machen?

Danke und Gruss
Sophie


----------



## Volvagia (25. Apr 2011)

```
package app;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 
 * @author Sophal. :P
 */
public class HtmlConv {
 
    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        // Methode zum Einlesen der Datei aufrufen
        umwandeln("C:/Users/Sophie/Desktop/datei1702_vor.html",
        		"C:/Users/Sophie/Desktop/datei1702_nach.html");
    }
    /**
     * Methode zum Einlesen der Datei
     * 
     * @param pfad
     * @throws IOException
     */
    public static void umwandeln(String quelle, String ziel) throws IOException {
    	// Drei Eingabeströme erzeugen und mit der Datei verbinden
        BufferedReader br = new BufferedReader(new FileReader(quelle));
        BufferedWriter bw = new BufferedWriter(new FileWriter(ziel));
        
        // Alle Zeilen aus der Datei lesen und zur Standardausgabe ausgeben
        do {
            String eineZeile = br.readLine();
            
            eineZeile = eineZeile.replace("ä", "&auml").replace("Ä", "&Auml")
                .replace("ö", "&ouml").replace("Ö", "&Ouml")
                .replace("ü", "&uuml").replace("Ü", "&Uuml")
                .replace("ß", "&szlig");

            bw.write(eineZeile);
            bw.write(System.getProperty("line.separator")); //Zeilenumbruch!!!
        } while(br.ready());
        
        br.close();
        bw.flush(); //Buffer leeren. :O
        bw.close();
    }
}
```


----------



## Sophie (25. Apr 2011)

Vielen Dank!
Das funktioniert bestens ... und line.seperator kannte ich auch noch nicht, sehr praktisch 

Gruss
Sophie


----------

