Ausgabe des Porgramms in txt. datei speichern ?

NooBLearninG

Mitglied
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.

Java:
        ...
	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

Top Contributor
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

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

ich habe es nun so versucht
Java:
	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.io_ObjectOutputStream.writeObject0(Unknown Source)
at java.io_ObjectOutputStream.writeArray(Unknown Source)
at java.io_ObjectOutputStream.writeObject0(Unknown Source)
at java.io_ObjectOutputStream.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

Top Contributor
Ich meinte zum Beispiel (!) den ursprünglichen Code
Code:
public void printallStudents() throws IOException{
    for(int index=0;index<students.length;++index){
        System.out.println("Student Nr: "+index);
...
zu ändern in
Code:
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

Mitglied
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

Top Contributor
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

Mitglied
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

Top Contributor
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
Code:
public String createStringContainingAllStudents() 
{
    String result = "";
    ... alle Student-Infos anhängen...
    return result;
}
womit sich die printAllStudents reduzieren würde auf
Code:
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)
...
 

Andi_CH

Top Contributor
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

Code:
java meinProgramm > out.txt

Code:
> 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.
 

Neue Themen


Oben