1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Java Konsolenausgabe

Discussion in 'Programmieren' started by steve1977, May 30, 2008.

Thread Status:
Not open for further replies.
  1. steve1977

    steve1977 Byte

    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
     
  2. AS_X

    AS_X Halbes Megabyte

    Wenn du eine solche Ausgabe bekommst, heißt das im Allgemeinen, dass die toString-Methode nicht überladen ist. Du musst dir einen anderen Weg suchen, an die Zeichen des Streams zu kommen.

    Leider muss ich gerade weg...
     
  3. steve1977

    steve1977 Byte

    Hi, danke für die hilfe, es wäre für mich sehr sehr hilfreich wenn mir jemand ein beispiel schicken könnte! Danke!!!
     
  4. daboom

    daboom Megabyte

    So wie ich das sehe, hast Du die Konstruktion der Stream-Objekte, die Du nutzt in die actionPerformedMethode reingehauen. Imo müsste diese Streams nur aber einmal angelegt werden.

    Was ich noch nicht ganz verstehe: Soll mit Klicken des Buttons einfach nur eine Art "Schreib alles, was jetzt kommt in mein TextFeld"-Modus aktiviert werden oder soll lediglich eine Art Refresh ausgelöst werden?

    Wenn ersteres, wäre es vielleicht sinnvoll, eine Klasse zu implementieren (am besten anonym), die von PrintStream ableitet und alles, was sie reinbekommt, immer in das Textfeld schreibt.

    Ich glaube nicht, dass Du die Piped-Streams benutzen solltest, da sie für Inter-Thread-Kommunikation gedacht sind.
     
  5. steve1977

    steve1977 Byte

    Hi, es soll so ablaufen, das man einmal den button drückt und dann soll fortlaufend die konsolennachrichten ausgegebn werden, so fern es welche gibt. Das was du mir vorgeschlagen hast , hört sich gut an, kannst du mir eventuell auch ein beispiel quellcodetechnische beispiel schicken, vielen dank schonmal!
     
  6. daboom

    daboom Megabyte

    Ok, habe es grad mal ausprobiert und funktioniert gut.

    Die PrintStreams schmeißt Du, wie gesagt weg. Dann sollte es etwa wie folgt sein:

    Code:
    // Memberdeklarationen
    PrintStream out;
    
    // Konstruktor Deines Frames
    public TestFrame() {
      ...
    
      out = new PrintStream(new OutputStream() {
      StringBuilder tmp = new StringBuilder();
        @Override
        public void write(int arg0) throws IOException {
          tmp.append((char) arg0);
          TestFrame.this.textArea.setText(tmp.toString());
        }
      });
    
      // Der Button hängt nur den Stream um
      btn.AddActionListener(new ActionListener() {
        @Override
        public actionPerformed(ActionEvent e) {
          System.setOut(TestFrame.this.out);
        }
      });
    }
    
    Hier gibt es nun ständig einen PrintStream, dessen zugrundeliegender OutputStream direkt in das TextArea reinschreibt. Wenn System.out nun mit diesem überschrieben wird, wird alles in die TextArea geschrieben.
    Ich hatte es so getestet, dass ich einen Thread gestartet habe, der sekündlich etwas nach System.out schreibt. Zuerst hat er das ganz normal auf die Konsole geschrieben, danach (nach dem Klick auf den Button) in die TextArea.
     
  7. daboom

    daboom Megabyte

    Ne kleine Rückmeldung, ob's funktioniert hat, wäre trotzdem toll. ;)
     
Thread Status:
Not open for further replies.

Share This Page