Zum Inhalt springen

Konsolenausgabe umleiten auf Textarea


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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 !!

Geschrieben

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

Geschrieben

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

Geschrieben

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]

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...