# Text in txt-Datei in letzte Zeile schreiben?



## MC_Basstard (21. Dez 2009)

Hallo Leute,

ich brauche unbedingt Hilfe und zwar will ich den Text, den ich in einem Textfeld schreibe in eine txt-Datei, in der schon etwas drinnen steht, speichern.

Mein problem ist es, dass ich nicht weiß wie, denn wenn ich den Dateinamen angebe und etwas hinein schreibe denk ich mal erstellt es die datei nur neu zumindest ist der Inhalt nicht mehr darin sondern nur noch das, was ich im Textfeld geschrieben habe.

Als Erstes würd ich gerne versuchen den Text aus dem Textfeld in die letzte Zeile zu schreiben.

Könnt ihr mir da helfen?

hier mal der wichtigste Code:


```
public class Datenschreiben extends JFrame implements ActionListener
{
	...

	String text = new String("");
	String dateiName = "Test.txt";	
	TextField tfSchreiben;
	
	public Datenschreiben()
	{
		...
		
		getContentPane().setLayout(new FlowLayout());
		tfSchreiben = new TextField(text,20);
		add(new JScrollPane(tfSchreiben));
		tfSchreiben.setCaretPosition(0);
		tfSchreiben.setEditable(true);
		tfSchreiben.setFont(new Font("Arial", Font.PLAIN, 14));
		
		
		...

		}
	
	
	public void schreiben() throws IOException{					
		
	    FileOutputStream schreibeStrom = new FileOutputStream(dateiName);		
	    text = tfSchreiben.getText();
	    for (int i=0; i < text.length(); i++){						
	      schreibeStrom.write((byte)text.charAt(i));	
	    }						
	    schreibeStrom.close();	
	    System.out.println("Datei ist geschrieben!");	
	}
	
	
	public void actionPerformed(ActionEvent aefiW4) {	
		
                          ...

		if (aefiW4.getSource().equals(buSpeichern)){
			try {
				schreiben();
			} catch (IOException e) {
				e.printStackTrace();
			}
			return;
			}

	}	
				
}
```


Schonmal großen Dank im Vorraus.
Gruß Stefan


----------



## noobadix (21. Dez 2009)

Hallo,

du könntest die Datei zunächst auslesen, in einen StringBuffer schreiben und dann das Neue dranhängen und die alte Datei dann überschreiben.

Gruß N.


----------



## noobadix (21. Dez 2009)

also so ungefähr:


```
...

public void speichern(){
   String toAppend = JTextField.getText();
   StringBuffer striBu = new StringBuffer();
   try{
      File f = new File("SpeicherDateiName");
      FileReader fr = new FileReader(f);
      BufferedReader reader = new BufferedReader(fr);
      String line = null;
      while((line = reader.readLine()) != null){
         striBu.append(line);
      }
      striBu.append(toAppend);
      reader.close();
      BufferedWriter writer = new BufferedWriter(new FileWriter("SpeicherDateiName"));
      writer.write(striBu.toString());
      writer.close()
      }
      catch(Exception e){}
}

...
```

Hab's nicht getestet!!!


----------



## Michael... (21. Dez 2009)

FileOutputStream besitzt auch noch weitere Konstruktoren:
FileOutputStream(File file, boolean append) 


			
				API Doku hat gesagt.:
			
		

> Creates a file output stream to write to the file represented by the specified File object. If the second argument is true, then bytes will be written to the end of the file rather than the beginning


----------



## MC_Basstard (21. Dez 2009)

Cool danke hat funktioniert! :toll:
Jetzt schau ich noch das ich den Inhalt einlese, das Neue hinzufüge, und dan alles Zeile für Zeile wieder auslese, so dass nicht alles nebeneinander steht.

Wenn ich nicht weiter komme melde ich mich wieder.

Gruß
Stefan


----------



## MC_Basstard (21. Dez 2009)

An was kann das liegen, dass in der erstellten Datei die eigentlichen "\n" anstatt eine neue Zeile zu machen nur als Viereck angezeigt werden?


----------



## Ebenius (21. Dez 2009)

MC_Basstard hat gesagt.:


> An was kann das liegen, dass in der erstellten Datei die eigentlichen "\n" anstatt eine neue Zeile zu machen nur als Viereck angezeigt werden?


An Windows. 

Du musst statt eines [c]\n[/c] den systemspezifischen Zeilentrenner verwenden: [c]System.getProperty("line.separator");[/c] Du kannst auch die Methode [c]newLine()[/c] des BufferedWriters benutzen; die macht's auch richtig.

Ebenius


----------



## MC_Basstard (21. Dez 2009)

Danke 
hab es jetzt hinbekommen, dass es immer in ne neue Zeile schreibt, aber leider öfters als gewollt ???:L


Hab es jetzt so geschafft:


```
...

public class Datenschreiben extends JFrame implements ActionListener
{
             ...

	String text = new String("");
	String dateiName = "Test.txt";	
	TextField tfSchreiben;
	private static String lesen = "";
	String ls = System.getProperty("line.separator");


	
	public Datenschreiben()
	{
		...
		
		getContentPane().setLayout(new FlowLayout());
		tfSchreiben = new TextField(text,20);
		add(new JScrollPane(tfSchreiben));
		tfSchreiben.setCaretPosition(0);
		tfSchreiben.setEditable(true);
		tfSchreiben.setFont(new Font("Arial", Font.PLAIN, 14));
		
		...

		}
	
	
	public void schreiben() throws IOException{
		text = tfSchreiben.getText();
		StringBuffer sb = new StringBuffer();
		try{
			FileReader fr = new FileReader("Kopie von buch.txt");	
			BufferedReader br = new BufferedReader(fr);
			String zeile = null;
			while( (zeile = br.readLine()) != null )
	    	{
	    	sb.append(lesen += zeile + ls);
	    	}
	    sb.append(text);
	    br.close();
	    BufferedWriter writer = new BufferedWriter(new FileWriter("Kopie von buch.txt"));
	    writer.write(sb.toString());
	    writer.close();
		}
		catch(Exception e){}
		return;
		}

	    
	    
	
	public void actionPerformed(ActionEvent aefiW4) {	
		
                          ...

		if (aefiW4.getSource().equals(buSpeichern)){
			try {
				schreiben();
			} catch (IOException e) {
				e.printStackTrace();
			}
			return;
			}
	
	}															
}
```


In der Datei stand zuvor:

Darius Haus, TS-A;
Michael Dach, AS-E;
Michael Dach, AS-E;
Beate Mayr, BT;
Color Green, HG;
Xaver Dill, KD-2;
Gerhard Groß, Dr., AH
Gerhard Groß, Dr., AH


Nun steht drinnen:

Darius Haus, TS-A;
Darius Haus, TS-A;
Michael Dach, AS-E;
Darius Haus, TS-A;
Michael Dach, AS-E;
Michael Dach, AS-E;
Darius Haus, TS-A;
Michael Dach, AS-E;
Michael Dach, AS-E;
Beate Mayr, BT;
Darius Haus, TS-A;
Michael Dach, AS-E;
Michael Dach, AS-E;
Beate Mayr, BT;
Color Green, HG;
Darius Haus, TS-A;
Michael Dach, AS-E;
Michael Dach, AS-E;
Beate Mayr, BT;
Color Green, HG;
Xaver Dill, KD-2;
Darius Haus, TS-A;
Michael Dach, AS-E;
Michael Dach, AS-E;
Beate Mayr, BT;
Color Green, HG;
Xaver Dill, KD-2;
Gerhard Groß, Dr., AH
Darius Haus, TS-A;
Michael Dach, AS-E;
Michael Dach, AS-E;
Beate Mayr, BT;
Color Green, HG;
Xaver Dill, KD-2;
Gerhard Groß, Dr., AH
Gerhard Groß, Dr., AH
das neu geschriebene


Ich weiß grad leider nicht, an was das liegt.
Da schreibts die erste Zeile hin dann die erste und zweite dann die erste, zweite und dritte und immer so weiter. 
Wie kann ich des ändern?

Gruß Stefan


----------



## Ebenius (21. Dez 2009)

Du fügst alles schon gelesene immer wieder hinzu. So geht's:

```
public void schreiben() throws IOException{
        text = tfSchreiben.getText();
        StringBuilder sb = new StringBuilder();
        try{
            FileReader fr = new FileReader("Kopie von buch.txt");   
            BufferedReader br = new BufferedReader(fr);
            String zeile = null;
            while( (zeile = br.readLine()) != null )
            {
            sb.append(zeile).append(ls);
            }
        sb.append(text);
        br.close();
        BufferedWriter writer = new BufferedWriter(new FileWriter("Kopie von buch.txt"));
        writer.write(sb.toString());
        writer.close();
        }
        catch(Exception e){}
        return;
        }
```
Die statische Variable [c]lesen[/c] kannst Du wieder entfernen.

BTW: Ich hab den StringBuffer durch StringBuilder ausgetauscht; weil's besser ist. 

Ebenius


----------



## MC_Basstard (21. Dez 2009)

Geil danke es funktioniert :toll:

Eine Frage hätt ich aber noch ^^

Geht das, das man die txt-Datei liest, etwas dazu schreibt und wieder abspeichert (wie wir es jetzt gemacht haben) es aber den Inhalt dann auf das Alphabet überprüft und alles in der richtigen alphabetischen Reihenfolge dan ordnet?

Ich denk mal, dass das mein beschränktes Java Wissen um weites übersteigt, dennoch würd ich gerne wissen ob das eigentlich geht.

Oder ob man das beim einlesen in eine Tabelle dann irgendwie überprüfen und nach dem Alphabet ordnen?

Würd erstmal einfach gerne wissen, ob das überhaupt geht.

Gruß Stefan


----------



## noobadix (21. Dez 2009)

Dazu kannst du jede zu schreibende Zeile in eine ArrayList packen und diese dann mittels Collections.sort(ArrayList) sortieren (ABC abc 123).

Wenn jedoch jemand ne Idee hat, wie man die Groß- und Kleinschreibung ignorieren kann?


----------



## MC_Basstard (21. Dez 2009)

Funktioniert das mit der ArrayList beim laden, schreiben und speichern in die txt-Datei, dass es danach im Alphapet drinen steht oder erst beim einlesen in eine Tabelle?

Gruß Stefan


----------



## noobadix (21. Dez 2009)

Anscheinend ändern sich deine Daten während der Programmausführung. Es wäre also gar nicht schlecht, wenn du vielleicht diese Daten ohnehin in eine ArrayList steckst, pro Index eine Zeile vielleicht, und diese dann bei jeder Änderung neu sortierst.

Gruß N.


----------



## Ebenius (21. Dez 2009)

Ich ignoriere mal die letzten beiden Beiträge. Sortieren beim Schreiben, ohne Groß-/Kleinschreibung zu beachten, geht dann also so: 
	
	
	
	





```
public void schreiben() throws IOException{
        text = tfSchreiben.getText();
        final List<String> lines = new ArrayList<String>();
        try{
            FileReader fr = new FileReader("Kopie von buch.txt");   
            BufferedReader br = new BufferedReader(fr);
            String zeile = null;
            while( (zeile = br.readLine()) != null )
            {
                lines.add(zeile);
            }
            lines.add(text);
            br.close();

            Collections.sort(lines, String.CASE_INSENSITIVE_ORDER);

            BufferedWriter writer = new BufferedWriter(new FileWriter("Kopie von buch.txt"));
            for (String line : lines) {
                writer.write(line);
                writer.newLine();
            }
            writer.close();
        }
        catch(Exception e){}
    }
```
Ebenius


----------



## MC_Basstard (22. Dez 2009)

Ohaaaa... geil danke es funktioniert 
:toll:

Damit ist das Thema hier sogar mehr erledigt als ich mir überhaupt erhofft habe 

Gruß
Stefan


----------

