# In .txt file schreiben aber unten anhängen



## Hayes (27. September 2004)

Hallo zusammen

So ich bin wieder einen Schritt weitergekommen bei meinem Tool, nun gehts ans FileHandling. Das funktioniert soweit auch alles, sofern ich nur etwas reinschreibe jedoch beim 2. mal überschreibt er mir immer das Alte (Welches schon drinstand). Ich hoffe ihr könnt mir da weiterhelfen 
Nachfolgen noch mein Code mit dem ich ins File schreibe


```
FileOutputStream out;
PrintStream p;
try{
 out = new FileOutputStream("data/berichte.txt");
 p = new PrintStream( out );
 p.println(date + "\n");
 p.println(omni + "\n");
 p.println(pluenderung + "\n");
 p.close();
}
catch (Exception o){
 JOptionPane.showMessageDialog(null, "Konnte Angriffsbericht nicht speichern", "Error!",JOptionPane.OK_CANCEL_OPTION);
}
JOptionPane.showMessageDialog(null, "Angriffsbericht erfolgreich gespeichert", "SUCCessfull",JOptionPane.OK_CANCEL_OPTION);
```

MfG
Hayes


----------



## squeaker (27. September 2004)

Schau dir mal das RandomAccessFile an. Das liefert die Funktionen die du brauchst (seek(), write())


----------



## Hayes (27. September 2004)

Jo es funktioniert danke vielmals 

MfG
Hayes


----------



## Thomas Darimont (27. September 2004)

Hallo!

siehe:


```
import java.io.FileWriter;
import java.io.IOException;

public class FileAppender {

	public static void main(String[] args) {
		try {
			FileWriter fw = new FileWriter("c:/test.fil", true); //Append =
																 // true
			fw.write(System.currentTimeMillis() + "\r\n");
			fw.flush();
			fw.close();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
```

Gruß Tom


----------



## Hayes (28. September 2004)

Hallo

Ich hab wieder ein Problem  Schreibs jetzt einfach mal hier rein dass ich nicht für jedes meiner Probleme einen neuen Thread eröffnen muss.

Und zwar gehts jetzt ums auslesen aus der Datei:


```
String line;
int anzRows = 0;
int dimensionOne = 0;
int dimensionTwo = 0;
//--------------------------------
//Alle Daten aus dem File auslesen
//---------------------------------
try{
     File dieDatei = new File("data/berichte.dat"); 
     BufferedReader file_in = new BufferedReader(new InputStreamReader(new       FileInputStream(dieDatei))); 
    while( (line=file_in.readLine()) != null){
	anzRows++;                                //Ermitteln der anzahl Reihen in der Datei
    }
    StringTokenizer stData = new StringTokenizer(line, "\n");
    String[][] readData = new String[anzRows][];
    while((line=file_in.readLine()) != null){
           while( stData.hasMoreTokens() ){
	readData[dimensionOne][dimensionTwo] = stData.nextToken();
	dimensionTwo++;
	if(readData[dimensionOne][dimensionTwo] == "--"){
	    dimensionOne++;
	}
          }
   }
  
   file_in.close();
}
catch (IOException i ){
          JOptionPane.showMessageDialog(null, "Konnte Datei nicht schreiben/Lesen","Error!",JOptionPane.OK_CANCEL_OPTION);
}
catch(NullPointerException nu){
          System.out.println(nu);
}
```

Mein Problem ist nun ich bekomm immer eine NullPointerException und zwar auf dieser Zeile : 
*StringTokenizer stData = new StringTokenizer(line, "\n");* 
Hab schon alles versucht aber komme nicht mehr weiter 

MfG
Hayes

€: Hm... tut mir leid wenns nicht so leserlich ist aber das Codetag verschiebt meinen ganzen Code


----------



## Vincentius (28. September 2004)

> _Original geschrieben von Hayes _
> 
> ```
> StringTokenizer stData = new StringTokenizer(line, "\n");
> ...


Die Zeile *StringTokenizer stData = new StringTokenizer(line, "\n");* muss hier in die erste *while* Schleife rein.


----------



## squeaker (28. September 2004)

Du liest das File ein und durchläufst es ganz um die Zeilen zu zählen. Wenn du es danach nocheimal von Vorne durchgehen willst, müsstest du die Datei neu öffnen. Einfacher wäre allerdings statt dem String-Array einen Vektor zu nehmen (kann sich dynamisch ändern) und ohne die Zeilenzahl vorher zu bestimmen deine Operationen durchführen und gleich den Inhalt bearbeiten.


----------



## Hayes (29. September 2004)

Hm... gibt es 2 Dimensinale Vektoren?

Ich habe in meiner Textdatei so kleine "Pakete" mit meinen Daten drin:


```
//Das hier wäre Paket 1:
Datum:  12:04 27-09-2004  
omni 96054
 
_max. KapazitÃ¤t: 2240
874 Eisen
376 Titan
193 Ã–l
96 Uran
118 Gold
insgesamt geplÃ¼ndert: 1657
--
//Das hier wäre Paket 2:
Datum:  12:04 28-09-2004  
omni 96051
 
_max. KapazitÃ¤t: 2240
874 Eisen
320 Titan
193 Ã–l
96 Uran
118 Gold
insgesamt geplÃ¼ndert: 1601
--
```

Bis zum *--*  ist immer ein Paket, nun hab ich mir folgendes überlegt: In der ersten Dimension des Arrays steht immer die Nummer des Paketes und in der zweiten Dimension die Daten zum dazugehörigen Paket. Also:

readData[0][0] wäre demfalls die erste Zeile des ersten Paketes, in diesem Fall : *Datum:  12:04 27-09-2004 *
readData[0][1] entspräche der zweiten Zeile des ersten Paketes : *omni 96054*
usw.
genauso verhaltet es sich mit dem zweiten Paket:
readData[1][0] entspräche der ersten Zeile im zweiten Paket :*Datum:  12:04 28-09-2004  *
usw.

Würde das auch mit Vektoren gehen? oder hättet ihr eine andere Idee wie ich das lösen könnte?

MfG
Hayes


----------



## squeaker (29. September 2004)

Du kannst in einem Vector einen weiteren Vector speichern.

Vector v1=new Vector(),
Vector v2=new Vector();
v1.add(v2);

da alle Objekte in einem Vektor gespeichert werden können.
Zum Auslesen musst du blos casten:

Vector v=(Vector)v1.elementAt(0);


----------



## Hayes (29. September 2004)

Ok ich werds mal so versuchen, danke 

MfG
Hayes


----------



## boelkstoff (30. September 2004)

Kannst auch eine ArrayList anstatt einen Vector nehmen.
Vector ist für Threads da synchr. Arraylist ist für nicht synchr. und damit etwas schneller


----------

