# StringBuilder von File einlesen



## bafl13 (16. Mai 2011)

Hallo
Ich hatte  ein problem ,ich will ein textdtei einlesen und dien inhalt in einem Stringbuilder speichern ,wie kann ich sowas machen,und wie könnte ich mehr als ein Datei in diesem Stringbuilder speichern und dann im computer anlegen??
Danke


----------



## zerix (16. Mai 2011)

Hallo,

schau dir mal den FileReader an und den BufferedReader an. Nützlich zum Datei einlesen
Galileo Computing :: Java ist auch eine Insel – 17 Datenströme
Galileo Computing :: Java ist auch eine Insel – 17.5 Datenströme filtern und verketten

Und hier noch ein Link zum StringBuilder.
Galileo Computing :: Java ist auch eine Insel – 4.4 Veränderbare Zeichenketten mit StringBuilder und StringBuffer

Eigentlich findest du dort alles was du brauchst. 



> wie könnte ich mehr als ein Datei in diesem Stringbuilder


Einfach eine Datei nach der anderen einlesen und in den StringBuilder schreiben.



> dann im computer anlegen


Was meinst du damit?

Gruß

zerix


----------



## bafl13 (16. Mai 2011)

zerix hat gesagt.:


> Hallo,
> 
> schau dir mal den FileReader an und den BufferedReader an. Nützlich zum Datei einlesen
> Galileo Computing :: Java ist auch eine Insel – 17 Datenströme
> ...


ich habe jetzt versucht dass wie im galileo computing und jetzt habe ich dieses Code

```
import java.io.*;
public class TextFilter2 implements FilenameFilter {

	String eingabe;
	void eingabeBekommen() throws IOException{
		InputStreamReader stream= new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(stream);
		System.out.println("Welcher Ordner");
		this.eingabe=br.readLine();
	}
	public boolean accept(File arg0, String arg1) {
		return false;
	}
	public void textDateien() throws IOException{
		
	
		int zaehler=0;
		StringBuilder ausgabe=new StringBuilder();
		File fin = new File(this.eingabe);		
		for (File f : fin.listFiles()) {
			if(f.getName().endsWith(".txt")){
				ausgabe.append(f);
			}
		}
		System.out.println(ausgabe);
	}		
	public static void main (String...args) throws IOException{
		TextFilter2 test= new TextFilter2();
		test.eingabeBekommen();
		test.textDateien();
	}

}
```
und irgendwie wenn ich  
	
	
	
	





```
ausgabe.append(f);
```
 schreibe dann bekomme ich
die namen von den dateien
aber wie konnte ich den inhalt bekommen??
bitte
und das programm bekommt ein verzeichniss wo es txt dateien gibt und muss alles in einem stringbuilder speichern
Vielen Dank


----------



## zerix (16. Mai 2011)

Du solltest dir nochmal den ersten Link anschauen. Du liest nämlich nicht eine Datei ein. Ich weiß nicht warum du FileFilter implementierst. 

Ich würde dir vorschlagen, dass du dir mal ein kleines Beispiel schreibst und dort einfach mal eine Datei einliest. 

Gruß

zerix


----------



## bafl13 (16. Mai 2011)

zerix hat gesagt.:


> Du solltest dir nochmal den ersten Link anschauen. Du liest nämlich nicht eine Datei ein. Ich weiß nicht warum du FileFilter implementierst.
> 
> Ich würde dir vorschlagen, dass du dir mal ein kleines Beispiel schreibst und dort einfach mal eine Datei einliest.
> 
> ...



Ja endlich funktioniert das Programm vielen dank 
nur jetzt habe ich ein kommisches Problem! 
ich kriege den fehler
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Unknown Source)
	at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
	at java.lang.AbstractStringBuilder.append(Unknown Source)
	at java.lang.StringBuilder.append(Unknown Source)
	at TextFilter2.textDateien(TextFilter2.java:30)
	at TextFilter2.main(TextFilter2.java:45)
obwohl das programm am anfang richtig funktioniert hat,und ich habe im internet gesucht und habe bemerkt dass dieser fehler kommt bei dateien die großer als 100MB und mein Programm ist sehr klein,trotz dem kommt dieser fehler ,vielleicht gibt es was falsches Bei dem??
hier ist das Code

```
import java.io.*;
public class TextFilter2 implements FilenameFilter {

	String eingabe;
	void eingabeBekommen() throws IOException{
		InputStreamReader stream= new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(stream);
		System.out.println("Welcher Ordner");
		this.eingabe=br.readLine();
	}
	public boolean accept(File arg0, String arg1) {//accept methode die prüft ob das File mit einem bestimmten String"arg1" siche beendet
		//falls ja gibt die true
		if(arg0.getName().endsWith(arg1)){
			return true;
		}
		return false;
	}
	public void textDateien() throws IOException{// die methode die verarbeitet alles  
		
	Reader reader=null;
		int zaehler=0;
		StringBuilder ausgabe=new StringBuilder();//die ausgabe die am ende gezeigt werden wird
		File fin = new File(this.eingabe);//das verzeichniss ,drin suchet das programm txt dateien		
		for (File f : fin.listFiles()) {//solange es dateien mit ende txt gibt
			if(accept(f,".txt")){
				 reader = new FileReader( f );
				 int read=reader.read();
				 while(read!=-1)
					 ausgabe.append((char)read);
					 read=reader.read();
				 } 
			}
		
		FileOutputStream schreibeStrom = new FileOutputStream(this.eingabe+File.separator+"zusammenfassung.txt");//neues datei erstellen  drin wird den Stringbuilder
		//gespeichert und nachher geschlossen um angelegt
		 for (int i=0; i < ausgabe.length(); i++){
		      schreibeStrom.write((byte)ausgabe.charAt(i));
		    }
		    schreibeStrom.close();
	}		
	public static void main (String...args) throws IOException{
		TextFilter2 test= new TextFilter2();
		test.eingabeBekommen();
		test.textDateien();
	}

}
```


----------



## zerix (16. Mai 2011)

Das liegt nicht direkt an deinem Programm. 
Es liegt daran, dass die VM default maximal nur 64 MB RAM verwendet und wenn du Dateien einliest die größer sind, kommt dieser Fehler. 
Also wenn es wirklich sein muss, dass du die Dateien komplett in den Speicher liest, musst du den Speicher der VM erhöhen. 
Das tust du so

```
-Xmx128m
```

Hier steht die 128 für die Größe und m für die Einheit hier MB. 

Gruß

zerix


----------



## bafl13 (16. Mai 2011)

zerix hat gesagt.:


> Das liegt nicht direkt an deinem Programm.
> Es liegt daran, dass die VM default maximal nur 64 MB RAM verwendet und wenn du Dateien einliest die größer sind, kommt dieser Fehler.
> Also wenn es wirklich sein muss, dass du die Dateien komplett in den Speicher liest, musst du den Speicher der VM erhöhen.
> Das tust du so
> ...


und wo schreibe ich diese zeile??


----------



## zerix (16. Mai 2011)

Das ist ein Argument für die VM. Wenn du von der Konsole aus startest

```
java -Xmx128m deineclass
```

Bei Eclipse kannst du es bei den Run-Configurations angeben und bei Netbeans bei den Projekt-Properties unter Run.

Gruß

zerix


----------



## bafl13 (17. Mai 2011)

zerix hat gesagt.:


> Das ist ein Argument für die VM. Wenn du von der Konsole aus startest
> 
> ```
> java -Xmx128m deineclass
> ...



Eigentlich es hat nicht funktioniert mit diesem Befehl leider aber ich habe bemerkt dass meine Whileschlafe endlos  ist deswegen hat es immer dasselben Wert eingelesen  Aber vielen vielen Dank zerix


----------

