# system.out und system.err  einer Methode in Datei schreiben.



## sunfy (6. Sep 2007)

Hallo,
ich versuche gerade die Ausgaben einer Methode in Dateien zu schreiben.
Folgendes habe ich mir überlegt:
ich rufe die methode auf, in der mit 

```
system.out.println("blah sysout");
system.err.println("ganz viele Errors");
```
etwas in die Console geschrieben wird.
Jetzt möchte ich halt nur nicht, das es in der Console landet, sondern es mit catch abfangen und in eine Textdatei schreiben.


```
try {
	methode(parameter);
} catch (??? syserr) {
	writeToFile("errors.txt", syserr.toString() );
} catch(??? sysout){
	writeToFile("sysouts.txt", sysout.toString() );
}
```

hat da jemand eine Idee, wie man das machen könnte?
(was genau man abfangen muss?

Gruß Sunfy


----------



## SlaterB (6. Sep 2007)

vor der Operation
System.setOut(myPrintStream); 
aufrufen

setzt voraus, dass du dich mit Streams usw. auskennst

Web-Suche nach 'java system.out umleiten' liefert viel, z.B.

http://support.microsoft.com/kb/252021/de


```
PrintStream ps = new PrintStream(
                             new BufferedOutputStream(new FileOutputStream(
                             new File("javalog.txt"))), true);
            System.setOut(ps);         
            System.setErr(ps);
```


----------



## Murray (6. Sep 2007)

Mit try-catch kann man nur Throwables abfangen. Was du brauchst, ist eine Ausgabeumleitung. Das geht mit System#setOut und System#setErr.

//EDIT: da war der Slater wieder schneller...


----------



## sunfy (6. Sep 2007)

Na das war ja mal ne schnelle Antwort.
Das klappt jetzt auch soweit.

Ich muss jetzt nur noch herausfinden, wie ich die Umleitung des sys.err und sys.out nach dem try-Block wieder in die Console ausgeben lasse.


```
try 
	    {
	    	PrintStream psOut = new PrintStream(
	    			new BufferedOutputStream(new FileOutputStream(
	    					new File("tmp","out.txt"))), true);
	    	System.setOut(psOut);
	    	
	    	PrintStream psErr = new PrintStream(
	    			new BufferedOutputStream(new FileOutputStream(new File("tmp","err.txt"))), true);
	    	System.setErr(psErr); 
	    	
	    	writeErrors();
	    } 
	    catch (Exception e)
	    {
	    	System.out.println(e.getMessage());
	    }
```


----------



## SlaterB (6. Sep 2007)

bisschen denken:

ein Tipp:
PrintStream oldOut = System.out;


----------



## sunfy (6. Sep 2007)

ja, soweit hatte ich eben auch schon gedacht.
Allerdings werden die syserr und sysout nach dem try block immernoch in die Datei geschrieben.


```
try 
	    {
	    	PrintStream psOut = new PrintStream(
	    			new BufferedOutputStream(new FileOutputStream(
	    					new File("tmp","out.txt"))), true);
	    	System.setOut(psOut);
	    	
	    	PrintStream psErr = new PrintStream(
	    			new BufferedOutputStream(new FileOutputStream(new File("tmp","err.txt"))), true);
	    	System.setErr(psErr); 
	    	
	    	writeErrors();
	    	
	    	PrintStream outStream = System.out; 
	    	System.setOut(outStream);
	    	
	    	PrintStream errStream = System.err;
	    	System.setErr(errStream);
	    } 
	    catch (Exception e)
	    {
	    	System.out.println(e.getMessage());
	    }	
		System.out.println("es klappt mit out");
		System.err.println("es klappt mit err");
```


----------



## Murray (6. Sep 2007)

Du musst dir die Streams merken, *bevor* du die neuen setzt.


----------



## sunfy (6. Sep 2007)

aja stimmt.

jetzt gehts.
danke für die schnelle Hilfe. 
gruß Sunfy


```
try 
	    {
	    	PrintStream oldOut = System.out; 
	    	PrintStream psOut = new PrintStream(
	    			new BufferedOutputStream(new FileOutputStream(
	    					new File("tmp","out.txt"))), true);
	    	System.setOut(psOut);

	    	PrintStream oldErr = System.err;
	    	PrintStream psErr = new PrintStream(
	    			new BufferedOutputStream(new FileOutputStream(
	    					new File("tmp","err.txt"))), true);
	    	System.setErr(psErr); 

	    	writeErrors();


	    	System.setOut(oldOut);
	    	System.setErr(oldErr);
	    } 
	    catch (Exception e)
	    {
	    	System.out.println(e.getMessage());
	    }
```


----------

