# Auslesen und schreiben in eine Textdatei.HILFE!HILFE!



## tanechka (28. Aug 2008)

Hallo,

ich habe schon vieles ausprobiert, aber ich komme selbe mit meinem Problem nicht klar. Ich soll eine Textdatei auslesen mit dem Namen "codes.txt" und ab neue Zeile neue Codes dazuschreiben.
Zum Beispiel ich habe in dieser Datei schon so ein Text geschieben:

ATTT
TTGG

Wenn ich was neues dazu schreiben will, soll dass ab neue Zeile anfangen:

ATTT
TTGG
TTGG

Ich habe bisher eine Methode geschrieben, die scheint aber nicht richtig zu funktionieren. Ich brauche eure Hilfe!!!! :bahnhof: 

Hier ist was ich ausprobiert habe:

```
public static void writeVectors( String vector)
			throws IOException {
//		PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(
//				"vectors.txt")));
		///
		 try 
	      {
	         File fileIn  = new File("vectors.txt");
	         File fileOut = new File("vectors.txt");

	         FileInputStream streamIn   = new FileInputStream(fileIn);
	         FileOutputStream streamOut = new FileOutputStream(fileOut);
	         
	         FileReader reader = new FileReader("vectors.txt");
	         Scanner in = new Scanner(reader);
	         
	         PrintWriter out = new PrintWriter("vectors.txt");
	         BufferedReader inn = new BufferedReader(new FileReader("vectors.txt"));
	         String s = inn.readLine();
	         //System.out.println(in.next());
//	         if (!in.hasNextLine()){
//	        	 
//	        	 out.print(vector);
//	        	 out.println();	        
//	         }       	
	         s = inn.readLine();
	         do {
	        	out.append(vector.charAt(0));
	     		//out.print("test");
	     		out.close();
	 			
	 		} while ((s = inn.readLine()) == null);

	         int c;
	         while ((c = streamIn.read()) != -1) 
	         {	 
	             
	             out.println();
	        	 out.print(vector);
	        	 out.println();
	         }

//	         streamIn.close();
//	         streamOut.close();
	      }
	      catch (FileNotFoundException e) 
	      {
	         System.err.println("FileCopy: " + e);
	      } 
	      catch (IOException e) 
	      {
	         System.err.println("FileCopy: " + e);
	      }
	   
	////
		    //out.print(vector);
			//out.println();
		   // out.close();
	}
```


----------



## Verjigorm (28. Aug 2008)

wow welch Chaos *kopfschüttel* :autsch:

Du solltest mal vielleicht GANZ von vorne anfangen mit Java

Zu deinem Problem sollteste dir mal in Ruhe durchlesen:
http://www.galileocomputing.de/openbook/javainsel7/javainsel_13_003.htm


----------



## tanechka (28. Aug 2008)

ja  , ich habe vieles ausprobiert. Alles scheinte nicht richtig zu funktionieren. Danke für den Link. Kannst du mir vielleicht Klassen anbieten, die mein Problem lösen könnten?


----------



## Guest (28. Aug 2008)

Kleines Beispiel, wie man einen String in eine Datei schreiben kann:

```
try
{
    FileWriter fw = new FileWriter("dateiname.txt");
    fw.write("1. Zeile: Test Ausgabe \r\n2. Zeile: in eine Datei");
    fw.close();
}catch(IOException ex)
{
    ex.printStackTrace();
}
```


----------



## tanechka (28. Aug 2008)

ich habe im Prinzip kein Problem, wenn es allein ums Schreiben oder Lesen aus einer Datei geht. Ich habe das Problem, wenn es an einer Datei passiert. Erst auslesen und dann ab der neuen Zeile etwas schreiben.


----------



## tanechka (28. Aug 2008)

wenn das Schreiben passiert, wird der Inhalt der Datei gelöscht. Es soll aber nichts gelöscht werden.


----------



## Guest (28. Aug 2008)

Wieso machst du dann kein append?


```
FileWriter fw = new FileWriter("dateiname.txt");
fw.append("\n mein neuer String");
```


----------



## tanechka (28. Aug 2008)

ich mache append(), aber ich mache vielleicht etwas falsch:


```
do {
              out.append(vector.charAt(0));
              //out.print("test");
              out.close();
             
          } while ((s = inn.readLine()) == null);
```

es wird was neues geschrieben und altes gelöscht.


----------



## Guest (28. Aug 2008)

Leider hab ich im Moment nicht die Möglichkeit dir weiter zu helfen. Allerdings heute abend werd ich mal ein Beispiel basteln und hier posten, wenn du das willst.


----------



## tanechka (28. Aug 2008)

gerne. Danke dir


----------



## Guest (28. Aug 2008)

So so funktionierts bei mir:


```
package demo;

import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;

public class MyFileWriter {

	//Die einzelnen Schritte:
	//1. Datei erzeugen
	public boolean createNewFile(String filename)
	{
		boolean create=true;
		File file = new File(filename);
		if (file.exists())
		{
			System.out.println("Die Datei existiert bereits!");
		}
		else{
			try {
				file.createNewFile();
				System.out.println("Die Datei " + file.getPath()+ " wurde neu erstellt.");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				create=false;
			}
		}
		return create;
	}
	
	//2. Teststring A in die Datei schreiben
	public boolean writeStringInFile(String filename, String strToWrite)
	{
		boolean write=true;
		try {
			BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); 
			bw.write(strToWrite+"\r\n");
			bw.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			write=false;
		}
		return write;
	}
	//3. Teststring B an die Datei dranhängen
   //Wenn append = false ist, geht der komplette vorherige Inhalt verloren
	public boolean appendString(String filename, String strAppend, boolean append)
	{
		boolean canAppend=true;
			try {
				FileOutputStream file = new FileOutputStream(filename,append);
				DataOutputStream out   = new DataOutputStream(file);
				out.writeBytes(strAppend+"\r\n");
				out.flush();
				out.close();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				canAppend=false;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				canAppend=false;
			}
		
		return canAppend;
	}
}
```

Der Aufruf:

```
package demo;

public class FileTester {

	public static void main(String[] args)
	{
		MyFileWriter writer = new MyFileWriter();
		String fileName = new String("C:\\testfile.txt");
		writer.createNewFile(fileName);
		writer.writeStringInFile(fileName, "Meine erste Zeile");
		writer.appendString(fileName, "Meine zweite Zeile", true);
	}
}
```

Viel Spaß damit .
LG


----------



## tanechka (29. Aug 2008)

Danke dir. Es funktioniert wunderbar. Ich habe nur diesen Teil geändert:


```
out.writeBytes(strAppend +[b] "\n"[/b]);
```


----------



## tanechka (29. Aug 2008)

```
out.writeBytes(strAppend + "\n");
```


----------



## tanechka (30. Aug 2008)

Ich habe noch eine Frage. Ich habe eine Methode geschrieben zum Auslesen von einem Vektor, der sich an einer bestimmten Position in meiner Textdatei befindet:

```
public static String readVector(String fileName,int position) throws IOException {		
		BufferedReader in = new BufferedReader(new FileReader(fileName));		
		int numRows = 0;
		String s = in.readLine();
		List<String> dnaCodes = new ArrayList();		
		do {			
			dnaCodes.add(s);
			numRows++;
		} while ((s = in.readLine()) != null);       
		in.close();		
		return dnaCodes.get(position).toString();
	}
```

In meiner Methode gehe ich alle Zeilen durch und schreibe die in ein Array und danach nehme nur den, der an einer gegebenen Position befindet. 
Da ich sehr viele Zeilen in der Datei habe, scheint mir die Lösung nicht effizient zu sein.Gibt es vieleicht andere Möglichkeiten, das Problem zu lösen. Meine Methode funktioniert richtig,nur nicht effizient((


----------



## 0x7F800000 (30. Aug 2008)

wozu speicherst du das alles in der liste? wenn du die information nicht brauchst, dann überliest du diese mit "readLine" einfach, und speicherst die überhaupt nirgendwo. Ansonsten, wenn du irgendwie einfach berechnen kannst, wo du zu lesen anfangen musst, dann kannst du auch RandomAccessFile.skip() direkt zu den benötigten daten gelangen, ohne jede zeile davor zu zählen...


----------



## tanechka (30. Aug 2008)

Ich habe alles in ein Array geschrieben, damit ich auf die Position kommen kann. Ich habe versucht mit der skip() Methode:


```
public static String readVector(String fileName, int position)
			throws IOException {
		BufferedReader in = new BufferedReader(new FileReader(fileName));
		String s ;		
		RandomAccessFile raf = new RandomAccessFile("vectors.txt", "r");

		if (((s = in.readLine()) != null)) {
			raf.skipBytes(???);
			s = raf.readLine();			
		}
		in.close();
		return s;
	}
```

Wie kann ich die Anzahl von Bytes kommen, durch die ich skippen soll?


----------



## 0x7F800000 (30. Aug 2008)

Ne, sorry, sich mit bytes herumzuprügeln ist blödsinn, mein fehler.
BufferedReader unterstützt doch auch die skip() methode, aber nicht für bytes sondern für ganze zeichen.
Dann musst du lediglich

```
BufferedReader.skip(zeilennummer*zeilenlänge)
```
aufrufen, und schon bist du an der richtigen stelle.

edit: wobei ich ehrlichgesagt keine ahnung habe, wie der BufferedReader das intern eigentlich anstellt. Vielleicht muss er intern jedes zeichen durchgehen und zählen, was stets sehr langsam wäre, weil die zeichen ja keine feste byte-länge haben müssen (bei irgendwelchen unicode-codierungen oder sowas, wo ein buchstabe mal 1 mal 4 bytes wegnimmt)

Mit dem RandomAccessFile wäre das aber auch nicht sonderlich angenehm, weil etwa zeilenumbrüche irgenwie betriebsystemanhängig sein können oder sowas... Dann sind manchmal ein, manchmal zwei zeichen nötig :bahnhof: glaub ich.

aber da würde es auch etwa mit

```
RandomAccessFile.skip(zeilennummer*(anzahlDerBuchstabenProZeile*1+2))
```
gehen, evtl wesentlich schneller als beim BufferedReader, weil direkt die bytes angegeben werden.

Aber wie gesagt: ich weiß es nicht.

Meiner meinung nach wird diese Textdatei eh kein mensch lesen wollen (geht doch um irgendwelche DNA/RNA sequenzen oder nicht? Die werden doch dutzend kilometer lang, oder?) Wozu soll man sich dann überhaupt stress mit den ganzen Zeichen und Buchstaben und Textdateien machen, statt die information direkt abzuspeichern?


----------



## tanechka (30. Aug 2008)

Es geht um DNA-Sequencen. Da die sehr lang sind, wollte ich die erstmal in einer Textdatei speichern und einen nach dem anderen abarbeiten.
Diese Code hat funktioniert:


```
public static String readVector(String fileName, int position)
			throws IOException {
		BufferedReader in = new BufferedReader(new FileReader(fileName));
		String s = in.readLine();
		RandomAccessFile raf = new RandomAccessFile("vectors.txt", "r");
		in.skip(s.length() * (position - 1));
		if (((s = in.readLine()) != null)) {
			s = in.readLine();
		}
		in.close();
		return s;
	}
```


----------



## tanechka (30. Aug 2008)

Es geht um DNA-Sequencen. Da die sehr lang sind, wollte ich die erstmal in einer Textdatei speichern und einen nach dem anderen abarbeiten.
Diese Code hat funktioniert:


```
public static String readVector(String fileName, int position)
			throws IOException {
		BufferedReader in = new BufferedReader(new FileReader(fileName));
		String s = in.readLine();
		RandomAccessFile raf = new RandomAccessFile("vectors.txt", "r");
		in.skip(s.length() * (position - 1));
		if (((s = in.readLine()) != null)) {
			s = in.readLine();
		}
		in.close();
		return s;
	}
```

Danke dir für Hilfe. Ich würde allein auf diese Methode nicht kommen.


----------



## 0x7F800000 (30. Aug 2008)

warum rechnest du "position-1" aus? was soll der mir ausgeben, wenn ich die 0-te zeile will? Oder willst du etwa, dass deine methode entgegen aller konventionen bei "1" anfängt zu zählen?  :!: lass das sein, das bringt nur ärger und viele exceptions und +1 -1 umindizierungen an jeder ecke...


----------



## 0x7F800000 (30. Aug 2008)

bzw. warum liest du in dieser if-abfrage die zeile zweimal aus, wofür soll das gut sein?
Und wofür ist dieser "raf" überhaupt noch da, den brauchst du doch gar nicht. Muss Eclipse (oder welche IDE du auch immer benutzst) doch unterstreichen, oder eine warnung anzeigen oder sowas....


----------



## tanechka (30. Aug 2008)

Ich brauche den ersten nicht.
(position-1), weil ich schon einmal in.readLine() aufgerufen habe. Wenn ich ohne if-Anweisung schreibe, kriege ich als Wert für s 10, obwohl es 0000000000000010 sein muss.Hmm... Mit if-Anweisung läuft alles ohne Probleme. Wenn ich den ersten Wert doch auslesen will,liefert die Methode Nullpointer.



```
public static String readVector(String fileName, int position)
			throws IOException {
		BufferedReader in = new BufferedReader(new FileReader(fileName));
		String s = in.readLine();		
		in.skip(s.length() * (position-1));
		if (((s = in.readLine()) != null)) {
			s = in.readLine();
		}
		in.close();
		return s;
	}
```


----------



## tanechka (30. Aug 2008)

(position-1), weil er ohne das nicht das richtige liefert. Warum ,weiss ich nicht.


----------



## 0x7F800000 (30. Aug 2008)

aja, weil du in der methode einmal pos-1 ausrechnest, dann aber zwei zeilen ausliest. Ziemlich sinnfrei. Kannst auch direkt pos so sein lassen wie es ist, und nur einmal das auslesen, was du brauchst. Zweimal falsch kann zwar evtl was richtiges liefern, aber sein muss es nicht oder?


----------

