Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Konsolenausgabe umleiten auf Textarea

Empfohlene Antworten

Veröffentlicht

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

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

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

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

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

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

mal als einwurf:

könnte man das nicht gleich mit System.setOut(PrintStream ps) erledigen?

bigredeyes

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

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]

Servus Perdi,

vielen Dank, die Lösung ist wirklich schön. An eine Ableitung habe ich nicht gedacht.

Peter

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.