steve77 Geschrieben 30. Mai 2008 Geschrieben 30. Mai 2008 Hallo leute, also ich habe da ein Problem, das ich nicht lösen kann. Also geht los: Ich möchte die Ausgaben (messages) die auf der Konsole erscheinen (wie z.B.) warn, info... usw) umleiten auf eine textarea. D.h. ich habe mir einen screen gebastelt mit einem Button (start Konsole), wenn ich diesen nun drücke soll die Konsole hier ausgegeben werden. Ich habe schon viel rumprobiert, bin aber leider noch zu keiner lösung gekommen. Ich weiss, dass es einen Inputstream und einen outputstream gibt, diese muss man miteinander verbinden. PipedInputStream pis = new PipedInputStream(); PipedOutputStream pos = new PipedOutputStream(pis); System.setOut(new PrintStream(pos)); Leider funktioniert das nicht. Der Teil meines Quellcodes für das Drücken des Buttons, sieht nun folgender massen aus: btn = new JButton("Start Console"); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { //Dieser Teil gibt die Uhrzeit aus StringBuffer buffer = new StringBuffer(); SimpleDateFormat sdf = new SimpleDateFormat("[hh:mm:ss]"); buffer.append(sdf.format(new Date())); buffer.append(" : "); buffer.append(new String(baos.toByteArray())); buffer.append("\n"); textArea.append(buffer.toString()); baos.reset(); //Hier soll nun die KOnsole ausgegeben werden PipedInputStream pis = new PipedInputStream(); PipedOutputStream pos = new PipedOutputStream(pis); System.out.println(pos); //der Standardausgabekanal wird umgesetzt System.setOut(new PrintStream(pos)); String test = pos.toString(); textArea.append("Variable test: " + test); } catch (Exception ex) { ex.printStackTrace(); } Das Ergebnis nach dem der Button "Start Consol" gedrückt wurde sieht folgendermassen aus: [08:26:55] : Variable test: java.io.PipedOutputStream@1cbfe9d Eigentlich sollte, da ja aber sowas wie folgendes stehen: [08:26:55] : log4j:WARN No appenders could be found for logger (org.apache.commons.configuration.ConfigurationUtils). Kann mir da jemand helfen, oder hat ein verständliches Beispiel für mich, für Hilfe wäre ich echt super dankbar. Gruß Steve Zitieren
kingofbrain Geschrieben 30. Mai 2008 Geschrieben 30. Mai 2008 Servus, erstens solltest Du Code-Tags verwenden, dann kann man Deinen Code auch lesen. Du hast ja schon mal den PipedInputStream und den PipedOutputStream gefunden. Der OutputStream bekommt den InputStream. Aus diesem willst Du dann lesen. Was Du machst, ist, Dir die String-Repräsentation des OutputStreams geben zu lassen. Das ist die von Dir geschriebene Ausgabe und nicht der Inhalt. Die API-Dokumentation sagt Dir das. Du willst also in einem Thread lesend auf den InputStream zugreifen und neue Werte an die TextArea dranhängen. Dann funktioniert es. Peter Zitieren
steve77 Geschrieben 30. Mai 2008 Autor Geschrieben 30. Mai 2008 Hi, danke schonmal für die Hilfe, ich verstehe aber folgende Sätze nicht: "Was Du machst, ist, Dir die String-Repräsentation des OutputStreams geben zu lassen. Das ist die von Dir geschriebene Ausgabe und nicht der Inhalt." Was meinst du mit String-Repräsentation? Wie verwendet man die Code-tags in diesem Forum? ??? Gruß steve Zitieren
kingofbrain Geschrieben 30. Mai 2008 Geschrieben 30. Mai 2008 Servus, die Code-Tags sind beim Eingabeeditor Deines Posts in der Toolbar rechts. Oder Du gibst [ CODE]<DEIN CODE>[ /CODE] (Leerzeichen raus, aber sonst hätte ich einen Code-Abschnitt eingefügt ) an, das ist das selbe. Jedes Objekt in Java hat die toString-Methode, da sie diese von java.lang.Object erbt. Diese Methode gibt standardmäßig den vollqualifizierten Klassennamen der Klasse, ein "@" und die Speicheradresse der Instanz zurück. So wie bei Dir: java.io.PipedOutputStream@1cbfe9d (Das waren Code-Tags) Du willst aber den Inhalt des Streams. An den kommst Du nicht, weil ein OutputStream zum Schreiben und nicht zum Lesen ist. Dafür gibt es InputStreams (z.B. den PipedInputStream (PIS), der an einen PipedOutputStream geklebt wird). Halte Dich also an den PIS und lese dort die Inhalte (in einem neuen Thread). Peter Zitieren
steve77 Geschrieben 30. Mai 2008 Autor Geschrieben 30. Mai 2008 Hi, ok. :confused:dann werden die Code Tags wie in anderen foren auch benutzt, werd mich ab jetzt daran halten . Nochmal zu meinem Problem: Hast du vielleicht ein gutes Beispiel wie ich den pipedinputstream auslesen kann? Danke !! Zitieren
kingofbrain Geschrieben 30. Mai 2008 Geschrieben 30. Mai 2008 Nachdem der PipedInputStream ein InputStream ist wie jeder andere, sollten die üblichen Verdächtigen genügend Beispiele haben (Galileo Online Buch "Java ist auch eine Insel" oder Krügers Javabuch). Schöne Grüße, Peter Zitieren
bigredeyes Geschrieben 30. Mai 2008 Geschrieben 30. Mai 2008 mal als einwurf: könnte man das nicht gleich mit System.setOut(PrintStream ps) erledigen? bigredeyes Zitieren
kingofbrain Geschrieben 30. Mai 2008 Geschrieben 30. Mai 2008 Ja, aber welchen PrintStream möchtest Du denn da haben? Du musst hier einen PrintStream mit PipedOutputStream nehmen und den an einen PipedInputStream knüpfen. Das Vorgehen passt schon. Wenn Du ein Codebeispiel hast, dann her damit, das wäre interessant. Peter Zitieren
perdian Geschrieben 30. Mai 2008 Geschrieben 30. Mai 2008 Ich seh keinen Grund mit Piped Streams zu arbeiten - viel zu kompliziert. Eine - in meinen Augen - ganz einfache Lösung ist: package test; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class ConsoleTest { public static void main(String[] args) { final JTextArea textArea = new JTextArea(); JFrame frame = new JFrame(); frame.setBounds(10, 10, 500, 200); frame.setContentPane(new JScrollPane(textArea)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); System.setErr(new PrintStream(new OutputStream() { @Override public void write(byte[] b, int off, int len) throws IOException { textArea.append(new String(b, off, len)); } @Override public void write(byte[] throws IOException { this.write(b, 0, b.length); } @Override public void write(int throws IOException { this.write(new byte[] { (byte)b }); } })); new Thread(new Runnable() { public void run() { for(int i=0; i < 10; i++) { System.err.println("Time: " + System.currentTimeMillis()); try { Thread.sleep(1000); } catch(Exception e) { // Ignore } } } }).start(); } }[/code] Zitieren
kingofbrain Geschrieben 30. Mai 2008 Geschrieben 30. Mai 2008 Servus Perdi, vielen Dank, die Lösung ist wirklich schön. An eine Ableitung habe ich nicht gedacht. Peter Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.