# Ausgabe des Porgramms in txt. datei speichern ?



## NooBLearninG (17. Jan 2011)

Moin,
ich möchte gerne das die Methoden Ausgabe meines Programms in eine txt. Datei rein geschrieben wird. Ich bekomme das irgendwie nicht hin und ich weiß auch nicht ob es möglich ist aber zunächst einmal mein Programm.


```
...
	public void printallStudents() throws IOException{
		for(int index=0;index<students.length;++index){
			System.out.println("Student Nr: "+index);
			students[index].print();
			System.out.println("*--------------------------*");
			
		}
	}
        ...
public static void main(String[]args)throws IOException{

		ObjectOutputStream ow = new ObjectOutputStream(new FileOutputStream("Student.txt"));
		StudentAdmin admin = new StudentAdmin(50);
		ow.writeObject(admin.printallStudents()); // das funktioniert nicht weiß nicht warum ?


	}
```

Ich möchte das die Methode printallStudents die Ausgabe nicht auf der Konsole ausgibt sondern in eine txt. Datei abspeichert aber es klappt irgendwie nicht.
ich habe jetzt nicht mein Gesamten Code eingefügt nur den Wichtigen Abschnitt denke ich mal. Wäre froh wenn mir einer helfen könnte.


----------



## Marco13 (17. Jan 2011)

writeObject will ein Objekt schreiben, aber printAllStudents gibt "void" (also nichts) zurück - die schreibt ja alles selbst, und gibt nichts zurück, was geschrieben werden könnte. Man könnte war mit
System.setOut(denOutput);
einen anderen Output setzen, wo alles hingeschrieben werden soll (z.B. auch in eine Datei) aber besser wäre es, wenn die Metode printAllStudents schon etwas übergeben bekäme, wo sie hinschreiben woll - man würde sie dann z.B. aufrufen mit
printAllStudents(System.out): // Alles auf die Konsole schreiben
oder
printAllStudents(someFileOutput): // Alles in eine Datei schreiben


----------



## NooBLearninG (17. Jan 2011)

Erstmal Danke für die Antwort. Also wie genau meinst du das ? 

ich habe es nun so versucht 

```
public BaseStudent[] printallStudents() throws IOException{
		for(int index=0;index<students.length;++index){
			System.out.println("Student Nr: "+index);
			students[index].print();
			System.out.println("*--------------------------*");
		}
               return students;
	}
	public static void main(String[]args)throws IOException{

        StudentAdmin admin = new StudentAdmin(50);
        ObjectOutputStream ow = new ObjectOutputStream(new FileOutputStream("Student.txt"));
        ow.writeObject(admin.printallStud()); // somit ist der Fehler verschwunden...
```

Wenn ich das so mache dann ist zwar der Fehler nicht mehr da aber wenn ich es ausführe bekomme ich immer noch die Fehler: 
        at java.ibjectOutputStream.writeObject0(Unknown Source)
	at java.ibjectOutputStream.writeArray(Unknown Source)
	at java.ibjectOutputStream.writeObject0(Unknown Source)
	at java.ibjectOutputStream.writeObject(Unknown Source)

ich habe mir folgendes überlegt

noch eine Methode zu machen die 
PrintallinFile(ObjectOutputStream ow){
ow = printallStudents();
}

würde so etwas gehen ? Solle ich mehr vom meinem Code zeigen falls nötig ?


----------



## Marco13 (17. Jan 2011)

Ich meinte zum Beispiel (!) den ursprünglichen Code

```
public void printallStudents() throws IOException{
    for(int index=0;index<students.length;++index){
        System.out.println("Student Nr: "+index);
...
```
zu ändern in

```
public void printallStudents(PrintStream ps) throws IOException{
    for(int index=0;index<students.length;++index){
        ps.println("Student Nr: "+index);
...
```

Und dann mit 
printAllStudents(System.out);
aufzurufen, oder eben mit

PrintStream ps = new PrintStream(someFile);
printAllStudents(ps);


----------



## NooBLearninG (17. Jan 2011)

VIELEN DANK,
ich habe es eben getestet und es funktioniert ist ja abgefahren, aber ich weißt nicht ob der Professor es so haben wollte hmm. aber eine andere Möglichkeit gibt es nicht oder ?


----------



## Marco13 (17. Jan 2011)

Die andere wäre, wie gesagt, am Anfang irgendwo

PrintStream ps = new PrintStream(someFile):
System.setOut(ps);

aufzurufen, um ALLE System.out's in die Datei umzuleiten. Aber "üblicherweise" schreibt man Methoden, die "irgendwas" "irgendwohin" schreiben sollen, so, dass man ihnen einen OutputStream übergibt (PrintStream kommt fast auf's gleiche raus).


----------



## NooBLearninG (17. Jan 2011)

jup, das mit dem printAllStudents(System.out) funktioniert auch, eigentlich funktioniert es genau so wie ich es haben wollte, allerdings weiß ich nicht ob es legal im Sinne meines Professor wäre :S ?
Das mit der Methode die Irgendwo etwas schreibt usw. damit ich OutputStream benutze kann werde ich mal probieren, aber welche Methode ist denn nun eigentlich besser oder sind beide Lösungswege gleich gut oder gibt es irgendwelche Nachteile ?


----------



## Marco13 (17. Jan 2011)

Naja, System.setOut sollte man "eigentlich" nicht aufrufen. Wenn du mal jemanden ärgern willst, dann füg' in einem großen Programm mal irgendwo versteckt ein "System.setOut(irgendwasWasInsNirvanaSchreibt)" ein, der wird beim Debuggen sicher seinen Spaß haben. 

Eine ganz andere Alternative wäre noch, dass die Methode z.B. einen String zurückgibt, also statt "printAllStudents" sowas wie

```
public String createStringContainingAllStudents() 
{
    String result = "";
    ... alle Student-Infos anhängen...
    return result;
}
```
womit sich die printAllStudents reduzieren würde auf

```
void printAllStudents()
{
    System.out.println(createStringContainingAllStudents());
}
```
und dieser String könnte dann eben genauso leicht in eine Datei geschrieben werden. 

Aber sowas mit einem OutputStream (oder PrintStream) ist schon OK. Das ist das allgemeingültigste: Wenn man eine Methode hat wie
void schreibeIrgendwasIn(OutputStream os) {...}
dann kann man dort alles mögliche übergeben:
- Einen OutputStream, der auf die Konsole schreibt
- Einen OutputStream, der in eine Datei schreibt
- Einen OutputStream, der in einem GUI in eine TextArea schreibt
- Einen OutputStream, der die Daten über eine Netzwerkverbindung verschickt
- Einen OutputStream, der in einen String reinschreibt (und mit dem String kann man dann wieder machen, was man will)
...


----------



## NooBLearninG (17. Jan 2011)

Vielen Dank für die ausführliche Informationen werde es mal mit der String Methode auch probieren.


----------



## Andi_CH (18. Jan 2011)

NooBLearninG hat gesagt.:


> VIELEN DANK,
> ich habe es eben getestet und es funktioniert ist ja abgefahren, aber ich weißt nicht ob der Professor es so haben wollte hmm. aber eine andere Möglichkeit gibt es nicht oder ?



Gibt es schon, aber das ist keine programmiertechnische Lösung


```
java meinProgramm > out.txt
```


```
> out.txt
```
 hinter einem beliebigen Programm bewirkt, dass alle Ausgaben auf den std-output in die Datei out.txt umgeleitet - auf der  Konsole siehst du dann allerdings nichts mehr.


----------

