{"id":566,"date":"2025-01-06T19:08:59","date_gmt":"2025-01-06T18:08:59","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=566"},"modified":"2025-02-25T19:13:20","modified_gmt":"2025-02-25T18:13:20","slug":"mitschneiden-der-system-out-und-system-err-streams-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=566","title":{"rendered":"Mitschneiden der System.out und System.err-Streams in Java"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Einleitung<\/h3>\n\n\n\n<p>In Java-Anwendungen kann es n\u00f6tig sein, die Konsolenausgabe (<code>System.out<\/code>) oder die Fehlerausgabe (<code>System.err<\/code>) mitzuschneiden. Die Gr\u00fcnde daf\u00fcr sind vielf\u00e4ltig:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Unit-Tests<\/strong>: Manche Tests pr\u00fcfen, ob bestimmte Texte in der Standardausgabe erscheinen.<\/li>\n\n\n\n<li><strong>Debugging und Logging<\/strong>: Falls eine genutzte Bibliothek kein Logging-Framework unterst\u00fctzt und nur <code>System.out<\/code> oder <code>System.err<\/code> verwendet, kann man die Ausgabe umleiten.<\/li>\n\n\n\n<li><strong>Speicherung und Analyse<\/strong>: Um die Konsolenausgabe sp\u00e4ter weiterzuverarbeiten oder zu protokollieren.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Vorgehen<\/h4>\n\n\n\n<p>In Java kann die Standardausgabe und Standardfehlerausgabe durch Umleiten der Streams <code>System.out<\/code> und <code>System.err<\/code> auf eigene Streams mitgeschnitten werden.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">1. Nutzung von <code>ByteArrayOutputStream<\/code><\/h5>\n\n\n\n<p>Ein einfacher Ansatz ist, die Standardstreams auf einen <code>ByteArrayOutputStream<\/code> umzuleiten:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> java.io.ByteArrayOutputStream;\n<span class=\"hljs-keyword\">import<\/span> java.io.PrintStream;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">StreamRedirectExample<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-comment\">\/\/ Original-Streams speichern<\/span>\n        PrintStream originalOut = System.out;\n        PrintStream originalErr = System.err;\n        \n        <span class=\"hljs-comment\">\/\/ Neue Streams erzeugen<\/span>\n        ByteArrayOutputStream outContent = <span class=\"hljs-keyword\">new<\/span> ByteArrayOutputStream();\n        ByteArrayOutputStream errContent = <span class=\"hljs-keyword\">new<\/span> ByteArrayOutputStream();\n        \n        System.setOut(<span class=\"hljs-keyword\">new<\/span> PrintStream(outContent));\n        System.setErr(<span class=\"hljs-keyword\">new<\/span> PrintStream(errContent));\n        \n        <span class=\"hljs-comment\">\/\/ Test-Ausgaben<\/span>\n        System.out.println(<span class=\"hljs-string\">\"Dies ist eine normale Ausgabe.\"<\/span>);\n        System.err.println(<span class=\"hljs-string\">\"Dies ist eine Fehlerausgabe.\"<\/span>);\n        \n        <span class=\"hljs-comment\">\/\/ Zur\u00fccksetzen der Streams<\/span>\n        System.setOut(originalOut);\n        System.setErr(originalErr);\n        \n        <span class=\"hljs-comment\">\/\/ Ergebnisse anzeigen<\/span>\n        System.out.println(<span class=\"hljs-string\">\"Mitgeschnittene Ausgabe: \"<\/span> + outContent.toString());\n        System.out.println(<span class=\"hljs-string\">\"Mitgeschnittene Fehlerausgabe: \"<\/span> + errContent.toString());\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h5 class=\"wp-block-heading\">2. Nutzung eines eigenen Output-Streams<\/h5>\n\n\n\n<p>Ein anderer Ansatz ist, einen eigenen <code>OutputStream<\/code> zu erstellen, der die Daten an mehrere Ziele weiterleitet:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> java.io.IOException;\n<span class=\"hljs-keyword\">import<\/span> java.io.OutputStream;\n<span class=\"hljs-keyword\">import<\/span> java.io.PrintStream;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TeeOutputStream<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">OutputStream<\/span> <\/span>{\n    private final OutputStream out1;\n    private final OutputStream out2;\n\n    public TeeOutputStream(OutputStream out1, OutputStream out2) {\n        <span class=\"hljs-keyword\">this<\/span>.out1 = out1;\n        <span class=\"hljs-keyword\">this<\/span>.out2 = out2;\n    }\n\n    @Override\n    public <span class=\"hljs-keyword\">void<\/span> write(int b) throws IOException {\n        out1.write(b);\n        out2.write(b);\n    }\n\n    @Override\n    public <span class=\"hljs-keyword\">void<\/span> flush() throws IOException {\n        out1.flush();\n        out2.flush();\n    }\n\n    @Override\n    public <span class=\"hljs-keyword\">void<\/span> close() throws IOException {\n        out1.close();\n        out2.close();\n    }\n\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        PrintStream originalOut = System.out;\n        ByteArrayOutputStream outContent = <span class=\"hljs-keyword\">new<\/span> ByteArrayOutputStream();\n        PrintStream teeStream = <span class=\"hljs-keyword\">new<\/span> PrintStream(<span class=\"hljs-keyword\">new<\/span> TeeOutputStream(originalOut, outContent));\n        \n        System.setOut(teeStream);\n        System.out.println(<span class=\"hljs-string\">\"Diese Ausgabe wird sowohl in die Konsole als auch in den Stream geschrieben.\"<\/span>);\n        \n        System.setOut(originalOut);\n        System.out.println(<span class=\"hljs-string\">\"Mitgeschnittene Ausgabe: \"<\/span> + outContent.toString());\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h5 class=\"wp-block-heading\">3. Nutzung eines Logging-Frameworks<\/h5>\n\n\n\n<p>Falls Logging gew\u00fcnscht ist, kann <code>System.out<\/code> mit einem Logging-Framework wie SLF4J oder Logback umgeleitet werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> org.slf4j.Logger;\n<span class=\"hljs-keyword\">import<\/span> org.slf4j.LoggerFactory;\n\n<span class=\"hljs-keyword\">import<\/span> java.io.PrintStream;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">LogRedirectExample<\/span> <\/span>{\n    private <span class=\"hljs-keyword\">static<\/span> final Logger logger = LoggerFactory.getLogger(LogRedirectExample.class);\n    \n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        System.setOut(<span class=\"hljs-keyword\">new<\/span> PrintStream(System.out) {\n            @Override\n            public <span class=\"hljs-keyword\">void<\/span> println(<span class=\"hljs-built_in\">String<\/span> x) {\n                logger.info(x);\n            }\n        });\n        \n        System.out.println(<span class=\"hljs-string\">\"Diese Nachricht wird geloggt.\"<\/span>);\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Fazit<\/h4>\n\n\n\n<p>Das Mitschneiden von <code>System.out<\/code> und <code>System.err<\/code> ist in Java einfach m\u00f6glich. Je nach Bedarf kann man einen einfachen <code>ByteArrayOutputStream<\/code> nutzen, eine eigene <code>OutputStream<\/code>-Implementierung schreiben oder die Ausgabe direkt an ein Logging-Framework weiterleiten. Welcher Ansatz gew\u00e4hlt wird, h\u00e4ngt vom jeweiligen Anwendungsfall ab.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einleitung In Java-Anwendungen kann es n\u00f6tig sein, die Konsolenausgabe (System.out) oder die Fehlerausgabe (System.err) mitzuschneiden. Die Gr\u00fcnde daf\u00fcr sind vielf\u00e4ltig: Vorgehen In Java kann die Standardausgabe und Standardfehlerausgabe durch Umleiten der Streams System.out und System.err auf eigene Streams mitgeschnitten werden. 1. Nutzung von ByteArrayOutputStream Ein einfacher Ansatz ist, die Standardstreams auf einen ByteArrayOutputStream umzuleiten: 2. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-566","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=566"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/566\/revisions"}],"predecessor-version":[{"id":567,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/566\/revisions\/567"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}