# Ausgabe in txt.Datei speichern



## TUGraz (3. Mai 2009)

hello...

ich habs geschafft eine eine eingabeaufforderung "Bitte geben sie den Pfad ein" zu erstellen.
danach kann ich den pfad eingeben und eine txt datei wird geöffnet und verändert.

nun hab ich den veränderten text jedoch unten in der ausgabe konsole (bei eclipse).

ich möchte jedoch , dass wieder eine eingabeaufforderung kommt " geben sie den pfad ein , wo die datei gespeichert werden soll" 

und die datei dann unter diesem namen gespeichert wird (mit verändertem text)
_____


```
import java.io.FileOutputStream;
import java.io.IOException;

public class Speichern {

  public static void main (String[] args) throws IOException{
    String text = "Dieser Text wird in einer Datei gespeichert!";
    String dateiName = "qwert.txt";
    FileOutputStream schreibeStrom = 
                     new FileOutputStream(dateiName);
    for (int i=0; i < text.length(); i++){
      schreibeStrom.write((byte)text.charAt(i));
    }
    schreibeStrom.close();
    System.out.println("Datei ist geschrieben!");
  }
}
```

____

so kann ich jedoch nur den oben eingegeben text in der oben eingegeben datei speichern...?? ich will aber die fertige ausgabe in eine datei speichern die ich unten eingebe...?

ich hoffe man versteht mein problem...

lg


----------



## Der Müde Joe (3. Mai 2009)

Für Text eigenen sich Streams nicht sehr gut und man sollte entsprechende Writer/Reader benutzen.
hier:
FileWriter (Java Platform SE 6)

Für Files evtl auch Channels bzw RandomAccessFile.

Für das lesen von der Konsole eignet sich der Scanner sehr
Scanner (Java Platform SE 6)


----------



## TUGraz (3. Mai 2009)

ok.
habe jetzt folgendes

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

public class Jh{
	public static void main(String[] args) throws IOException{
		File datei = new File("test.txt");
		FileWriter schreiber = new FileWriter(datei);
		schreiber.write("hallo");
		schreiber.close();
	}
}
```
es wird nun die test.txt erstellt mit dem inhalt "hallo"

wie schaffe ich es nun, das ergebnis eines programms zu speichern?

z.b: a + b = c

und c sollte dann in der txt stehen


----------



## Der Müde Joe (3. Mai 2009)

```
int a = 2;
int b = 2;
int c = a+b;

writer.write(""+ c);
```


----------



## TUGraz (3. Mai 2009)

Erstmal danke für die schnellen antworten.

habst soweit geschafft mit speichern.

hab aber noch eine letze frage...

zur zeit habe ich ja  bei 
File datei = new File("c:/test.txt");
die datei stehn in welche gespeicher wird.

wie mache ich eine aufforderung " Geben sie den Speicherort ein" , um den pfad unten einzugeben,??


----------



## Der Müde Joe (3. Mai 2009)

>wie mache ich eine aufforderung " Geben sie den Speicherort ein" , um den pfad unten einzugeben,?? 



> Für das lesen von der Konsole eignet sich der Scanner sehr
> Scanner (Java Platform SE 6)




```
System.out.println("Geben sie den Speicherort ein: ");
Scanner scanner = new Scanner(System.in);
String fileName = scanner.next();
```

oder natürlich normal über einen einen Stream.


----------



## TUGraz (3. Mai 2009)

Danke hab soweit alles...

nur noch 1 letztes problem:

ich habe nun in einer klasse eine integration 
habe das ergebnis x genannt. 

ich möchte nun in der ausgabe-Klasse (wo ich nun pfad eingeben kann)

bei  schreiber.write(""+ "test")

schreiber.write(""+ x) haben.

jedoch weiß ich nicht, wie ich dieser ausgabe-klasse die variable x übergebe oder einfüge????

lg


----------



## Der Müde Joe (3. Mai 2009)

Vergiss das ("" + "test") gleich wieder. Ich hab das nur als String-Cast benutzt. Das Problem ist, das bei write keine int geschrieben werden können. Diese werden als Char interpretiert. Also wird der int 49 als 'a' interpretiert (ob das Stimmt? siehe ASCII Tabelle) Hingegen "" + int wird zuerst zusammengehängt, das ganze als String interpretiert und dann zb 49 als String geschreiben.

Nun zu deinem Problem:

Code?

EDIT:
ok..stimmt nicht 49 ist die Zahl 1
65 wäre das A und 97 das a


----------



## TUGraz (3. Mai 2009)

also ich hier mal die integrationsmethode:


```
public void trapez() throws IOException
    {
        double z;
        double summe=0.0;
        double b=0;
        double h=0.0;
        double a = 0.0;//daten[0];
        for(int i=1; i<daten.length;i++)
        {
            summe=0;
            b=daten[i];
            h=(b-a)/i;
            
            summe+=1/2*(0+daten[i]);
            
            for(int y=1; y<i;y++)
            {
                summe+=daten[y];
            }
        }
        for(int x=0;x<ergebnis.length;x++);
        	
			z = (ergebnis[x]);
			  
    }
```
hier hab ich das ergebnis als z definiert (obwohl ich nicht weiß, ob dass so gehn könnte)

und hier die ausgabeklasse:

```
import java.io.File;

import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;


public class Ausgabe {

	private String a;
	
	public Ausgabe(String a) throws Exception
	{
		
		this.a = a;
		ausgeben ();
		
	}
	
	public void ausgeben () throws IOException
	{
		
		FileOutputStream fos = fos = new FileOutputStream(a);
	
		File datei = new File(a);

	      FileWriter schreiber = new FileWriter(datei);
	  	
	 
		
		schreiber.write(""+ z);
	     
	      schreiber.close();
	      
	}
	
}
```
und es sollte nun das ergebnis in die datei geschrieben werden...


----------



## Der Müde Joe (3. Mai 2009)

Gewöhn dir an, deinen Code in java tags zu setzen 
	
	
	
	





```
[*/java] (ohne den Stern)

Nun statisch wäre das ganz einfach:
[code=Java]import java.io.FileWriter;
import java.io.IOException;

public class Ausgabe {

	public static void writeToFile(String fileName, String str) throws IOException {
		FileWriter writer = new FileWriter(fileName);
		writer.write(str);
		writer.flush(); // pre 1.6 notwendig
		writer.close(); // ab 1.6 flush und close
	}

	public static void main(String[] args) {
		// mach ein paar berechnugen
		int result = 123456798;
		String str = "" + result; // mach einen String aus dem int

		try {
			Ausgabe.writeToFile("myfile", str);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
```

dynamisch auch

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

public class Ausgabe {

	public void writeToFile(String fileName, String str) throws IOException {
		FileWriter writer = new FileWriter(fileName);
		writer.write(str);
		writer.flush(); // pre 1.6 notwendig
		writer.close(); // ab 1.6 flush und close
	}

	public static void main(String[] args) {
		// mach ein paar berechnugen
		int result = 123456798;
		String str = "" + result; // mach einen String aus dem int

		Ausgabe ausgabe = new Ausgabe();
		try {
			ausgabe.writeToFile("myfile", str);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
```


----------



## TUGraz (3. Mai 2009)

entweder du hast mich falsch verstanden oda ich kapiers nicht...

ich kann in meine txt Datei schon eine Zahl (int oda double) speichern.

mein problem ist, dass diese zahl in einer anderen klasse ist.

und wenn ich nun bei 
schreiber.write(""+ z)
schreibe, kommt die Fehlermeldung z cannot resolved...
weil z in dieser klass nicht definiert ist...

ich möchte nun z aus der anderen klass wo es definiert ist, in die neue klasse übergeben.....

lg


----------



## Der Müde Joe (3. Mai 2009)

>ich möchte nun z aus der anderen klass wo es definiert ist, in die neue klasse übergeben

Du musst eben das z übergeben.

Bei meinen Beispiel (statisch) würdest du in deinem Code zb:
Ausgabe.writeToFile("filename", "" + z);
schreiben. Dann wird z übergeben und ins File geschrieben.


----------



## Der Müde Joe (3. Mai 2009)

zB:

```
import java.io.IOException;

public class AndereKlasse {
	public static void main(String[] args) {

		double d = 132d;
		double z = calc(d);
		String str = "" + z;
		try {
			Ausgabe.writeToFile("myFile", str);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static double calc(double in) {
		return ++in;
	}
}
```


----------



## TUGraz (3. Mai 2009)

wenn ich z.B in meiner

public class Ausgabe

a + b = z 

habe

und im schreiber.write(""+ z) habe. 

funktioniert alles super.

nur ich habe a + b = z in der 

public class Verarbeitung

und den schreiber.write(""+ z) in der Ausgabe - Klasse.

und somit steht in der Ausgabe Klasse z cannot be resolved, weil es eben nur in der Verarbeitugnsklasse beschrieben ist.

gibt es keine einfache funktion um einer variable zu übernehmen?

z.B get.z oda sowas??


----------



## Der Müde Joe (3. Mai 2009)

>gibt es keine einfache funktion um einer variable zu übernehmen?

klar. return den double in deiner Methode trapez, sowie in meiner Methode calc.
Nach dem Ende der Methode ist die Variable z nicht mehr sichtbar bzw nicht mehr vorhanden. Wenn du z ausserhalb der Methode benutzen möchtest musst du diese zurückgeben, bzw in einen Instanzvariable oder Klassenvariable (ehen schlecht) schreiben und dann über einen getter zur verfügung stellen.


----------



## TUGraz (3. Mai 2009)

naja ich glaub ich verstehs, aber ich kanns nicht ausführen:


```
public double erg=0;
    

    double[] daten;
    double[] ergebnis;
	private int x;
    
	public Verarbeitung (){}
    public Verarbeitung(int Integration, double[] daten) throws IOException {
	}	 
  

public double getEerg()
		    
{
  return erg;
```

... und dann in der ausgabe klasse...?


```
double erg = verarbeitung.getEerg();
```

nur dann wird wieder verarbeitung cannot be resolved....


----------



## Der Müde Joe (3. Mai 2009)

> Gewöhn dir an, deinen Code in java tags zu setzen
> 
> 
> 
> ...


----------



## Der Müde Joe (3. Mai 2009)

ums nochmals auf den Punkt zu bringen:

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

public class AndereKlasse {
	
	private double someDouble;
	
	public AndereKlasse(double d) {
		this.someDouble = d;
	}
	
	public double calc(double in) {
		return someDouble + in;
	}

	public static void main(String[] args) {
		// mach eine Instanz der Verarbeitenden Klasse
		AndereKlasse aK = new AndereKlasse(123d);
		// rechne irgendswas in dieser Klasse
		double result = aK.calc(123d);
		// mach einen String aus dem double damit die Ausgabe Klasse damit arbeiten kann
		String str = "" + result;
		try {
			// übergebe resultat an die Ausgabe Klasse zum ins File zu scheiben
			Ausgabe.writeToFile("myFile", str);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	// die Ausgabe Klasse (halt innere Klasse aber Wayne..
	static class Ausgabe {
		public static void writeToFile(String fileName, String str) throws IOException {
			FileWriter writer = new FileWriter(fileName);
			writer.write(str);
			writer.flush(); // pre 1.6 notwendig
			writer.close(); // ab 1.6 flush und close
		}
	}
}
```


----------



## TUGraz (3. Mai 2009)

```
import java.io.IOException;
		   


public class Verarbeitung {
	
	
	double erg;
    double[] daten;
    double[] ergebnis;
	private int x;
    
	
    public Verarbeitung(int Integration, double[] daten) throws IOException {
		  
	
    	 
        //Intregel: 1=Simpsonregel ; 2=Trapezregel
        this.daten = daten;
        ergebnis = new double[daten.length];
        
        if(Integration==1)
            simpson();
        else
            trapez();
    }
    

    
    
	public void trapez() throws IOException
    {
		
        double summe=0.0;
        double b=0;
        double h=0.0;
        double a = 0.0;//daten[0];
        for(int i=1; i<daten.length;i++)
        {
            summe=0;
            b=daten[i];
            h=(b-a)/i;
            
            summe+=1/2*(0+daten[i]);
            
            for(int y=1; y<i;y++)
            {
                summe+=daten[y];
            }
        }
        for(int x=0;x<ergebnis.length;x++);
        	
        
        
    
			erg = (ergebnis[x]);
			
    }
```


die zweite Regel wäre jetzt noch simpson, aber die lass ich zur zeit beiseite.
also ich habe nun ein ergebnis (erg)

und nun die ausgabe klasse:


```
import java.io.File;

import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;


public class Ausgabe {

	private String a;
	
	
	public Ausgabe(String a) throws Exception
	{
		
		this.a = a;
		ausgeben ();
		
	}
	
	public void ausgeben () throws IOException
	{
		
		FileOutputStream fos = fos = new FileOutputStream(a);
	
		File datei = new File(a);

	      FileWriter schreiber = new FileWriter(datei);
	  	

		
		schreiber.write(""+ erg);
	     
	      schreiber.close();
	      
	}
	
}
```

und er schreibt mir erg cannot be resolved...

ich dank dir schon mal für deine vorschläge von vorher um mir das zu erklären, aber ich beschäftige mich ca seit 4 tagen mit java...

lg


----------



## Der Müde Joe (3. Mai 2009)

dein Code mit Kommentaren:

```
import java.io.IOException;

public class Verarbeitung {
    
    double erg;
    double[] daten;
    double[] ergebnis;
    
    // für nix zu gebrauchen: sollte weg
    private int x;
    
    public Verarbeitung(int Integration, double[] daten) throws IOException {
		// Intregel: 1=Simpsonregel ; 2=Trapezregel
		this.daten = daten;
		ergebnis = new double[daten.length];

		if (Integration == 1) {
			// simpson();
		} else {
			trapez();
		}
	}
    
 
    public void trapez() throws IOException {

		double summe = 0.0;
		double b = 0;
		// für nix:
		double h = 0.0;
		double a = 0.0;// daten[0];
		for (int i = 1; i < daten.length; i++) {
			summe = 0;
			b = daten[i];
			//macht nix
			h = (b - a) / i;

			summe += 1 / 2 * (0 + daten[i]);

			for (int y = 1; y < i; y++) {
				summe += daten[y];
			}
		}
		// diese Zeil macht gar nichts:
		for (int x = 0; x < ergebnis.length; x++);
		// ergebnis[x] --> funktioniert nur weil ein globales x vorahnden ist
		erg = (ergebnis[x]);
		// auch mit schleife wäre es sinnlos, da erg immer wieder überschreiben wird.
	}
    
    public double getErgebnis() {
    	return this.erg;
    }
}
```


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

public class Ausgabe {

	// sprechende Variablen benutzen!!
	private String fileName;

	public Ausgabe(String fileName) throws Exception {
		this.fileName = fileName;
		// für was das??
		// ausgeben();
	}

	public void ausgeben(String meineAusgabe) throws IOException {
		FileWriter schreiber = new FileWriter(fileName);
		schreiber.write(meineAusgabe);
		schreiber.close();
	}
	
	// Aufrufen das ganze mit
	// Ausgabe ausgabe = new Ausgabe("myFile");
	// ausgabe.ausgeben("hallo welt");
}
```

erg ist in der Augabe Klasse nicht bekannt. Entweder muss du es hohlen über den getter, welchen ich dir geschrieen habe oder übergeben, so wie im kleinen Beispiel in der Ausgabe.


----------



## TUGraz (3. Mai 2009)

der getter scheint mir die einfachere art oder??

jedoch hab ich noch nichts über einen getter gelesen und außer dem was ich oben gepostet hab kenn ich mich nicht wirklich aus.

kann ma das nicht einfach mit

Klassenname.getVariable ???


----------



## Der Müde Joe (3. Mai 2009)

der getter scheint mir die einfachere art oder??

Nein. 

>kann ma das nicht einfach mit
>klassenname.getVariable ??? 

Ja. Dafür müsste die Variable aber statisch sein --> meist sehr schlecht

Ich hab dir das ganze mal aufbereitet, wie es ca aussehen sollte

```
import java.io.IOException;

public class Verarbeitung {
    
    private double[] daten;
    
    public Verarbeitung(double[] daten) {
		this.daten = daten;
	}
 
    public double trapez() {
    	// berechne was zu berechenen ist/verarbeite daten nach der Methode Trapez
		// gib das Ergebnis zurück
		return 123d;
	}
    
    public double simpson() {
    	// berechne was zu berechenen ist/verarbeite daten nach der Methode simpson
    	// gib das Ergebnis zurück
    	return 123d;
    }
	
	public static void main(String[] args) {
		double[] dA = {1d,2d};
		Verarbeitung v = new Verarbeitung(dA);
		// das resultat der Methode trapez mit dem input dA
		double trapez = v.trapez();
		// gib das ganze aus
		Ausgabe ausgabe = new Ausgabe("myFile");
		try {
			ausgabe.ausgeben("" + trapez);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
```


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

public class Ausgabe {
	// sprechende Variablen benutzen!!
	private String fileName;

	public Ausgabe(String fileName)  {
		this.fileName = fileName;
	}

	public void ausgeben(String meineAusgabe) throws IOException {
		FileWriter schreiber = new FileWriter(fileName);
		schreiber.write(meineAusgabe);
		schreiber.close();
	}
}
```


----------



## TUGraz (3. Mai 2009)

was is das 123d bei return und das

 double[] dA = {1d,2d};

1d, 2d ???


----------



## Der Müde Joe (3. Mai 2009)

```
int i = 1; // ein int
float f = 1f //ist kein int sondern ein float, darum f
double d = 1d // ist nun ein double
//alternativ
double d = 1.0 // Zahl mit Komma --> kann kein int sein, drum kein d notwendig
float f = 1.0 // dito
```


----------

