Hallo,
habe mich gegenwärtig noch sehr wenig mit Streams befasst. So dachte ich mir, schreibst'e mal eben ne "Cmd" als Gui, die die Standard Streams in, out, err aus System nutzt.
So habe ich für die Ausgabe(out & err) eine JTextArea genommen und den PrintStream angepasst. Das klappt auch wunderbar.
Jedoch habe ich mit der Eingabe so meine Problemchen. Dafür habe ich ein JTextField vorgesehen. Aber meine irrsinnigen Konstruktionen führen nur zu Exceptions. Habe gerade auch keinen konkrete Idee welchen Ansatz man wählen sollte, stehe also völlig auf dem Schlauch.
Ich hoffe, dass mir der ein oder andere ein paar Tipps geben könnte.
System.in hat in der GUI ja auch nichts zu Suchen, deswegen weiß ich nicht so ganz, was du eigentlich willst.
Ohne Code kann man nur sagen: "Fehler beheben, dann klappt das schon"
Habe mir gedacht, eine Art Console zu progammieren, die die IDE Console ersetzt. So kann man mit einen Programm auch ohne IDE kommunizieren, da dann ja Methoden wie println() wegfallen. Die Ausgabe wird so auf meine TextArea umgeleitet und man muss das Programm nicht aus der CMD starten.
So sieht bisher meine Methode aus, die fürs Initialisieren und Setzen der Streams, zuständig ist:
Java:
privatevoidinitStreams(){
prin =newPrintStream(newOutputStream(){@Overridepublicvoidwrite(int b)throwsIOException{
textArea.append((char) b +"");}});System.setOut(prin);System.setErr(prin);}
Also die Streams in System (out, err und in) sind fest mit der Konsole verbunden, da kann man nichts ändern. Ferner kann man eine Konsole ab JRE 1.6 (glaube ich) aus einer GUI heraus mit "System.console()" öffnen - ok... ich hab' des noch nicht hinbekommen.
Ansonsten bleibt dir nur eine eigene Konsolenimplementation der die Eingaben parsed und per "Runtime.getRuntime().exec()" an das Betribssystem weitergibt.
Es gibt doch für jeden dieser Streams ein Setter, von daher kann man da schon jede Menge machen.
Aber Output-Stream und Input-Stream sind verschiedene Sachen, du kannst aber deinen eigenen Inputstream Schreiben, der einfach die Ausgabe des OS weiterleitet. Writing Your Own Java I/O Stream Classes könnte für den Anfang helfen.
@XHelp: Und wie willst du die geänderten Streams wieder mit der Console verbinden? Prinzipell macht des nur Sinn, wenn die neuen Streamklassen die Ein- bzw. Ausgaben an die jeweiligen Original-Streams weitergereicht werden. Kommandos lassen sich darüber deswegen immer noch nicht ausführen.
Natürlich nicht. Auch ohne es umzuleiten oder was auch immer: nur weil man System.out.println("dir") macht, heißt es nicht, dass die Konsole das Verzeichnis auflistet.
Es ging ja um System.in ersetzen, so wie ich das verstanden habe. Aber der Plan war für mich eh von anfang an etwas zu komisch.
Gerade bei System.in ist das Problem, dass der Original-Strem bis zum Drücken der Eingabetaste blockiert. Daraus folgt, wenn du deine Eingaben mitverfolgen willst, muss dein Input-Stream bereits selber über einen "Parser" (ist an dieser Stelle eher der falsche Begriff ) verfügen, der auf Steuer- und Eingabetasten reagiert, während er Buchstaben und Zeichen schon mal in die Ausgabe (System.out) schreibt. Besser wäre es aber, wenn die Emulierte Konsole noch mal ein separater Output-Stream ist, an den die 3 eigenen System-Streams ihre Ausgaben weiter reichen, so kann man alle 3 z.B. separat farblich kennzeichnen.
Ja, aber dein ganzer Aufbau ergibt nur wenig Sinn. Wenn du eine GUI machen willst, dann mach auch eine GUI. Wenn du eine Konsolenanwendung machen willst, dann mach eine Konsolenanwendung. Wenn du Benutzereingaben aus der GUI haben willst, dann hast du eben ein JTextField dafür, wo du die Eingabe auch direkt ablesen kannst.
@XHelp: Wenn mich meine Sinne nicht täuschen möchte der TS so eine Art Konsole wie sie z.B. in Eclipse zu finden ist. Ein JTextfield mag sich dafür vllt. anbieten, so einfach isses dann aber auch nicht.