# Datei öffnen, lesen, bearbeiten, in neuer datei speichern



## KimKaze (9. Okt 2007)

Hi, 

ich habe das Problem, dass ich es nicht schaffe eine Datei einzulesen die zu verändern und das ganze dann in einer neuen Datei zu speichern.

Ich habe versucht das ganze aus "Java ist auch eine Insel" und "Jetzt lerne ich Java" zu verstehen komme aber noch nicht ganz dahinter... kann mir da jemand ein wenig hilfestellung geben...


Ich würde gerne einfach nur aus der Datei "anfang.txt" die erste Zeile einlesen, verändern, und dann in die Datei "ende.txt" speichern. dann das ganze mit der 2ten Zeile usw....

Ich erwarte nicht jemand den Code postet mit dem kommentar "da bitte" ich würde die sache gerne verstehen, oder kennt jemand weitere gute Hilfeseiten in denen das etwas genauer erklärt wird?.


Gruß
Andi


----------



## SlaterB (9. Okt 2007)

also man schlägt so ein Buch auf, findet fertigen Code wie
Listing 12.14 com/javatutor/insel/io/stream/FileReaderDemo.java, main()
in 
http://www.galileocomputing.de/openbook/javainsel6/javainsel_12_003.htm

und Erklärungen dazu, was will man mehr?
wieso nun das ganze zum x-ten Mal erklären wenn du andere gute Erlärungen offensichtlich genauso wenig verstehst?

da macht es doch nur Sinn, den Spieß umzudrehen:
was genau verstehst du daran nicht?!, 

File erstellen?, Reader erstellen?, einzelnes Zeichen oder ganze Zeile lesen?
oder klappt gar das Einlesen und nun gehts dir um das Speichern?

beschreibe doch millimetergenau, was das Problem ist??


----------



## KimKaze (9. Okt 2007)

Die Datei einlesen mit 


```
import java.io.*;

public class ZweiteÜbung {

	public static void main(String[] args) throws IOException {
		
		FileReader eingabestrom = new FileReader("ZweiteUebungDatei.txt");
		int gelesen;
		StringBuffer text = new StringBuffer(10);
		boolean ende = false;
		while(!ende){
			gelesen = eingabestrom.read();
			if (gelesen == -1)
				ende = true;
			else 
			text.append((char)gelsen);
		}
                System.out.println(text);
     } // Ende static void main

} // Ende class ZweiteÜbung
```

ist nicht das Problem...

Auch das ganze in einer Datei ausgeben, mit


```
import java.io.*;

public class ZweiteÜbung {

	public static void main(String[] args) throws IOException {
             File datei = new File("Test.txt");
             FileWriter ausgabestrom = new FileWriter(datei);
             PrintWriter ausgabe = new PrintWriter(ausgabestrom);
             ausgabe.println("bla bla bla schrei in die datei");
             ausgabe.close();

     } // Ende static void main

} // Ende class ZweiteÜbung
```
ist nicht das Problem.. aber wie schaff ich es dass ich z.B. die erste Zeile aus der anfangsdatei einlese. komplett umdrehe und in einer enddatei wieder ausgebe.

Sprich in Anfangs.txt steht
hallo duda
wie gehts dir

in der End.txt soll dann stehen
adud ollah
rid stehg eiw

das schaff ich einfach nicht..  [/code]


----------



## SlaterB (9. Okt 2007)

na das ist doch mal ne Info

verwende auch jeden Fall einen BufferedReader :
BufferedReader b = new new BufferedReader(eingabestrom);

dann bekommst du mit         b.readLine() eine ganze Zeile als String und musst dich nicht unbedingt um StringBuffer kümmern
(Dateiende: zeile ist null)

und außerdem musst du Reader + Writer gleichzeitig offen haben,
in der Schleife dann:
eine Zeile lesen, bearbeiten, schreiben

am Ende beide closen, auch den Reader,


----------



## Michael... (9. Okt 2007)

Also ist das umdrehen des Strings Dein Problem.
Man könnte einfach von hinten beginnend mittels charAt() den String in der Schleife durchlaufen. Mit dem PrintWriter kann man dann die chars in die neue Datei schreiben.

Eventuell gibt's da auch was performanteres.


----------



## KimKaze (9. Okt 2007)

den String umdrehen würde ich einfach mit ner for-schleife.


```
import java.io.*;

public class ZweiteÜbung {

	public static void main(String[] args) throws IOException {
		String sZeile;
		try {
			FileReader eingabestrom = new FileReader("anfangs.txt");
			BufferedReader b = new BufferedReader(eingabestrom);
			sZeile = b.readLine();     // eine zeile nach der anderen einlesen ????
			File datei = new File("end.txt");
            FileWriter ausgabestrom = new FileWriter(datei);
            PrintWriter ausgabe = new PrintWriter(ausgabestrom);


			for (int i = length(sZeile); i >= 0; i-- ){
				ausgabe.println(char[i]); // Zeichen an der Stelle i in neue datei ausgeben ???
			} // Ende for-schleife


		} // ende von try
		catch(FileNotFoundException e){
			System.out.println("Datei nicht gefunden!");
		} // ende von catch

		ausgabe.close();
		b.close();
				
	} // Ende static void main

} // Ende class ZweiteÜbung
```

aber das stimmt alles noch nicht so.. gibt noch viele fragezeichen.. wo seht ihr ja...


----------



## SlaterB (9. Okt 2007)

das Einlsen muss einer Schleife passieren, so wie du es anfangs mit 
while(!ende){ 
}
hattest, das war schon gut,
nur eben innen drin ganze Zeilen auslesen statt einzelner Chars

die Ausgabe dann nicht für jeden Buchstaben einzeln,
sondern den gesammten String auf einmal schreiben,

wenn du die Zeichen umdrehen willst, dann mache das davor,
baue dir einen String Zeichen für Zeichen umgedreht auf,
aber dann den fertigen String schreiben


----------



## KimKaze (9. Okt 2007)

so weit so gut ?

```
import java.io.*;

public class ZweiteÜbung {

	public static void main(String[] args) throws IOException {
		String sZeileEinlesen;
		String sZeileAusgeben;
		int iGelesen;
		try {
			FileReader eingabestrom = new FileReader("anfangs.txt");
			BufferedReader b = new BufferedReader(eingabestrom);			
			boolean ende = false;
		    while(!ende){
		    	sZeileEinlesen = b.readLine();
		        if (iGelesen == -1){
		            ende = true;
		        	} // ende von then
		        else {
		        	File datei = new File("end.txt");
		        	FileWriter ausgabestrom = new FileWriter(datei);
		        	PrintWriter ausgabe = new PrintWriter(ausgabestrom);
		        		for (int i = length(sZeileEinlesen); i >= 0; i-- ){
		        				sZeileAusgeben = sZeileAusgeben + (char[i]); 

//   er soll an sZeileAusgeben das aktuelle Zeichen an der Stelle [i] anhängen????? 
//   wie genau geht das ? length(sZeileEinlesen) gibt es so nicht wie sieht der befehl aus?????

		        		} // ende for-schleife
		        	ausgabe.println(sZeileAusgeben);	
		        } // ende von else	
		    } // ende von while (!ende)
		} // ende von try
		catch(FileNotFoundException e){
			ausgabe.println("Datei nicht gefunden!");
		} // ende von catch
		ausgabe.close();
		b.close();
	} // ende static void main

} // ende class ZweiteÜbung
```

er soll an sZeileAusgeben das aktuelle Zeichen an der Stelle _ anhängen????? 
wie genau geht das ? length(sZeileEinlesen) gibt es so nicht wie sieht der befehl aus?????_


----------



## SlaterB (9. Okt 2007)

if (iGelesen == -1){ 
musst du nun durch 
if (sZeileEinlesen == null){ 
ersetzen

den PrintWriter nur einmal VOR der Schleife definieren,

sZeileAusgeben musst du in jedem Schleifendurchlaufen wieder auf "" setzen
und dann string.charAt(i), string.length()

API?


----------



## KimKaze (9. Okt 2007)

```
import java.io.*;

public class ZweiteÜbung {

	public static void main(String[] args) throws IOException {
		String sZeileEinlesen;
		String sZeileAusgeben;
    	File datei = new File("end.txt");
    	FileWriter ausgabestrom = new FileWriter(datei);
    	PrintWriter ausgabe = new PrintWriter(ausgabestrom);
		try {
			FileReader eingabestrom = new FileReader("anfangs.txt");
			BufferedReader b = new BufferedReader(eingabestrom);			
			boolean ende = false;
		    while(!ende){
		    	sZeileAusgeben = ("");
		    	sZeileEinlesen = ("");
		    	sZeileEinlesen = b.readLine();
		        if (sZeileEinlesen == null){
		            ende = true;
		        	} // ende von then
		        else {
		        		for (int i = length(sZeileEinlesen); i >= 0; i-- ){
		        				sZeileAusgeben = (sZeileAusgeben + sZeileEinlesen.charAt(i)); 
		        		} // ende for-schleife
		        	ausgabe.println(sZeileAusgeben);	
		        } // ende von else	
		    } // ende von while (!ende)
		    b.close();
		} // ende von try
		catch(FileNotFoundException e){
			ausgabe.println("Datei nicht gefunden!");
		} // ende von catch
		ausgabe.close();
	} // ende static void main

} // ende class ZweiteÜbung
```

length(sZeileEinlesen) makelt er noch rot an.. da such ich gerade noch nach einem befehl zu...


----------



## SlaterB (9. Okt 2007)

string.length() 

habe ich zwar im Posting davor erst später reineditiert, aber nur Sekunden später.. 

---------
sZeileAusgeben = (""); 
??
->
sZeileAusgeben = ""; 



sZeileEinlesen = (""); 
sZeileEinlesen = b.readLine();
??
->
sZeileEinlesen = b.readLine();

-----

wenn du einen String der Länge 2 hast,
dann ist es schlecht, auf drei Positionen zuzugreifen: Index 2, 1 und 0,
das wird nicht klappen

-------

wieso fängst du FileNotFoundException ab, aber nicht IOException?
wieso b.close() im try/catch, das andere close() außerhalb?


----------



## KimKaze (9. Okt 2007)

also erstens hammer ich die ganze zeit auf F5 zum aktualisieren und habe daher die änderung noch nicht gesehen aber mich schon ein wenig gewundert..

aber das der string die länge 2 hat und er aber dann 3 durchläufe machen würde lässt sich einfach mit 

```
i = (length(sZeileEinlesen) -1)
```
 mein problem ist aber das es den befehl length() nicht gibt oder bei mir auf jeden fall angemakelt wird..
The method length(String) is undefined for the type ZweiteÜbung


----------



## KimKaze (9. Okt 2007)

ach ich depp is natürlich sEingabeZeile.length.. haett ich ja mal drauf kommen können...klappt jetzt auf jeden fall...
danke für di super hilfe !!!   :shock:


----------

