Exit Befehl in eigener Konsole

haui95

Bekanntes Mitglied
Guten Tag,

Ich habe mir jetzt endlich einen Server erstellen können, den ich in einer eigenen, in Java geschriebenen Konsole starte. Nun möchte ich die Konsole aber auch wieder schließen können, also nicht nur durch betätigen des Schließen Buttons, sondern auch durch Eingabe des Exit Befehls.

Nun habe ich im Internet folgendes gefunden, um den Inhalt der Konsole zu löschen:

Java:
char c;
    InputStream po = process.getInputStream();
        while ((c = (char) processOutput.read()) != -1) {
            if ((byte) c == 12) {
                outputArea.setText("");
            }
        }

Nun frage ich mich zum Einen, was es genau mit diesem Bytecode auf sich hat und wie man für den Befehl "cls", den man in der Java Konsole eingibt, auf einen Bytewert von 12 kommt, und zum Anderen, welchen Bytecode man abfragen müsste, um dem äquivalenten CMD Befehl "exit" in einer if-Abfrage handhaben zu können.

Vielen Dank !

MfG
 
Zuletzt bearbeitet von einem Moderator:

xehpuk

Top Contributor
Nun habe ich im Internet folgendes gefunden, um den Inhalt der Konsole zu löschen:
Keine Ahnung, was das machen soll. Sieht für mich ziemlich schwachsinnig aus.
Bei
Code:
char c = ...; boolean b = c == -1;
sollte b eigentlich immer
Code:
false
sein, weil
Code:
char
keine negativen Werte annimmt.

in einer eigenen, in Java geschriebenen Konsole
Wie hat man das zu verstehen?

Was meinst du damit? Den Cast auf
Code:
byte
und den Vergleich mit 12? Würd ich auf jeden Fall vergessen.
Das Wort ist jedenfalls schlecht gewählt, denn unter Java-Bytecode versteht man schon etwas anderes: Java bytecode - Wikipedia, the free encyclopedia

Deinem Code-Schnipsel ist zu entnehmen, dass du einen [JAPI]Process[/JAPI] hast, von dessen InputStream du lesen willst?
Zeichenbasierte Streams liest man über einen [JAPI]InputStreamReader[/JAPI] aus und wrappt ihn gern in einen [JAPI]BufferedReader[/JAPI]:
Java:
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
    if (line.equals("exit")) {
        // Server killen
    }
}
 
Zuletzt bearbeitet:

haui95

Bekanntes Mitglied
Danke !

Ja, ich weiß auch nicht, inwiefern mir der Codeschnipsel aus dem Internet weiterhelfen kann,
auf jeden Fall war der Code den du gepostet hast auch schon recht hilfreich, da ich schon mit verschiedenen Output Streams versucht habe, das Problem zu lösen, es jedoch nicht hinbekommen habe.
Was mich jedoch wundert ist, dass, auch wenn mir der Code aus dem Internet nicht wirklich etwas bringt, dieser jedoch funktioniert und den CMD Befehl "cls" an der Stelle bei den Cast auf
Code:
byte
ausführt und den Inhalt des Fensters löscht.

Hier noch einmal der Codeausschnitt, da ich mich glaube ich einmal vertippt habe:

Java:
char c;
InputStream output = p1.getInputStream();
    while ((c = (char) output.read()) != -1) {
        if ((byte) c == 12) {
            ConsoleCmdGui.txtConsole.setText("");
        } else {
               [...]
        }
    }

MfG
 

Anhänge

  • console.PNG
    console.PNG
    14,6 KB · Aufrufe: 51
Zuletzt bearbeitet:
J

jnetdev

Gast
1) Java-Bytecode ist mal ein ziemlich schlecht gewähltes Wort. Als ichs gelesen habe dachte ich an was total anderes.

2) Was meinst du mit "eigener Console in Java" ? Etwas was in einem Terminal läuft ? Das tun grundsätzlich alle Terminal-Programme ohne GUI. Oder meinst du eine eigene GUI die aussieht wie ein Terminal und ein ähnliches verhalten nachahmt ? Kann ich mir zwar nicht von dir vorstellen, ich weis aber das es sowas schon gibt.

3) Ich nehme mal an dein Problem bezieht sich auf folgendes Thema : http://www.java-forum.org/netzwerkp...va-chat-verbindung-server-fehlgeschlagen.html
Dort siehst du unten in dem Code den ich gepostet habe wie es richtig geht. Das "PrintStream.println()" muss nicht unbedingt sein, dient aber dem sauberen Abbau des Threads auf dem Server, ist also zu bevorzugen anstatt den Server-Thread gewaltsam nach Timeout mit Thread.interrupt() zu killen.


@xehpuk
Ich weis zwar auch das Thread.stop() deprecated ist, aber nicht wirklich wie diese mal ursprünglich geplant und implementiert war. Aber grundsätzlich würde ich mal schätzen das diese durch einen native call den Thread einfach gekillt hat. Und was macht interrupt ? Etwas ähnliches : native ein Flag setzen was die VM selbstständig prüft und mit einer Exception rausspringt. Ohne try-catch oder gesetzten Thread.UncaughtExceptionHandler hat es den selben effekt nur das es halt API-konform ist. Um einen Thread von außen zu killen sollte man in dessen Loop grundsätzlich ein von außen toogle-bares Flag prüfen. Für blocking-I/O hab ich mal was auf stackoverflow gelesen.
 

Mujahiddin

Top Contributor
Java:
char c;
InputStream output = p1.getInputStream();
    while ((c = (char) output.read()) != -1) {
        if ((byte) c == 12) {
            ConsoleCmdGui.txtConsole.setText("");
        } else {
               [...]
        }
    }

Also dieser Codeschnipsel ist ja wirklich eigenartig, ich frage mich, wo du den herhast.
Code:
InputStream output
<-- meinst du das ernst? :D
Außerdem wandelt der Code einen byte in einen char um, um diesen dann wieder in einen byte umzuwandeln... Wozu das ganze, frag ich mich.
 

haui95

Bekanntes Mitglied
Ich galube, dass dieses

Java:
if ((byte) c == 12) {
      ConsoleCmdGui.txtConsole.setText("");
}

nur funnktioniert, weil sich Process an die Ausgangsströme von CMD anhängt, und somit auch den Befehl "cls" in Byteform abfragen kann. Nur wie würde es mit dem CMD Befehl "exit" aussehen ?

MfG
 
Zuletzt bearbeitet:

haui95

Bekanntes Mitglied
So hab es hinbekommen, indem ich einfach die Byte Werte beim Cast von
Code:
Char
auf
Code:
Byte
über
Java:
System.out.println((byte) c)
ausgegeben habe.

Java:
BufferedReader pOutput = new BufferedReader(new InputStreamReader(proc1.getInputStream()));
    while ((c = (char) pOutput.read()) != -1) {
        System.out.println((byte) c);
            if ((byte) c == 12) {
                ConsoleCmdGui.txtConsole.setText("");
            } else if ((byte) c == -1) {
                 System.exit(c);
            }
      }
 

haui95

Bekanntes Mitglied
Hmm...

habe mich gewundert, warum der CMD Prozess nach Beenden der Konsole im Taskmanager immer noch aktiv war, dabei habe ich garnicht berücksichtigt, dass ich meine Instanz von Process mit destroy() beenden muss.

Java:
else if ((byte) c == -1) {
     proc1.destroy();
     System.exit(proc1.exitValue());
} [...]

Nun frage ich mich aber, wie beim Eintippen des Befehls "exit" ein Return Code von -1 zustande kommt und kein Return Code von 0, also normales Beenden ?

MfG
 
H

Hüte

Gast
Wie gesagt, byte oder char kann doch gar net negativ werden. Für den Rest würde ich mal in der API nachschauen. Woher kommt denn des Beispiel überhaupt? Kannst du eine Referenz angeben?

Hüte
 

xehpuk

Top Contributor
Etwas ähnliches : native ein Flag setzen was die VM selbstständig prüft und mit einer Exception rausspringt. Ohne try-catch oder gesetzten Thread.UncaughtExceptionHandler hat es den selben effekt nur das es halt API-konform ist.
Nein. Eine InterruptedException wird nur an wohldefinierten Stellen geworfen. Ein
Code:
Thread.stop()
kann den Thread an beliebiger Stelle rausschmeißen. Wenn dieser Thread also gerade dabei war, den Zustand eines Objekts zu ändern, ist dieses dadurch korrupt, die Anwendung insgesamt also kaputt.
Solange das Interrupted-Flag nicht überprüft wird, juckt es den Thread gar nicht.

Um einen Thread von außen zu killen sollte man in dessen Loop grundsätzlich ein von außen toogle-bares Flag prüfen.
Nein, das von mir gezeigte Konstrukt ist in Ordnung und common practice. Den Thread beendet man kontrolliert, indem man den Stream/Socket schließt.
Bei NIO geht es mit [JAPI]InterruptibleChannel[/JAPI] über ein normales
Code:
Thread.interrupt()
.

Nochmal im Klartext:
Code:
while ((c = (char) pOutput.read()) != -1)
ist Käse und äquivalent zu:
Java:
while (true) {
    c = (char) pOutput.read();
    // ...
}

Gehen wir von einer gängigen Zeichenkodierung aus (Windows-1252, UTF-8), dann bedeutet 12 an dieser Stelle, dass das Zeichen "Form feed" übertragen wurde, was ich nebenher auch für unwahrscheinlich halte.

Der Code ist also Quatsch. Ich kann mir auch nicht vorstellen, dass er funktioniert. Es wird immer nur auf ein Byte, nämlich 12, überprüft. Es kann also unmöglich an der Kombination der drei Zeichen "cls" liegen, dass die Bedingung eintrifft.

Wieso hältst du an dem Code fest? Löse es so, wie vorgeschlagen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Programm beenden ohne System.exit() oder Runtime.exit() Java Basics - Anfänger-Themen 5
J Java was Started but Returned Exit Code=13 in Eclipse Java Basics - Anfänger-Themen 13
M Verwendung von System.exit(0) problematisch? Java Basics - Anfänger-Themen 1
D Problem mit meinem ersten JOptionPane - Fatal exception occurred. Program will exit. Java Basics - Anfänger-Themen 6
R System.exit mit String als Rückgabedatentyp Java Basics - Anfänger-Themen 3
Q Could not find main class: XXX.main. Programm will exit Java Basics - Anfänger-Themen 4
J Schleife und system.exit(); Java Basics - Anfänger-Themen 2
Guybrush Threepwood System.exit(int status) Java Basics - Anfänger-Themen 3
B Could not find the main class. program will exit Java Basics - Anfänger-Themen 11
hdi System.exit() Status Code in Eclipse? Java Basics - Anfänger-Themen 2
T Programm beenden (Exit function?) Java Basics - Anfänger-Themen 6
J System.exit () frage Java Basics - Anfänger-Themen 3
S System.exit(0) oder was? Java Basics - Anfänger-Themen 16
A Programm ignoriert System.exit(0); Java Basics - Anfänger-Themen 10
A Exit-Button Java Basics - Anfänger-Themen 12
G System.exit(0); Java Basics - Anfänger-Themen 12
G System.exit(0); Java Basics - Anfänger-Themen 6
K System.exit() - Konstanten ? Java Basics - Anfänger-Themen 2
G Unterschid von depose() und System.exit() Java Basics - Anfänger-Themen 5
L Ein JFrame schließen ohne System.exit(). Java Basics - Anfänger-Themen 4
H Could not find the main Class, program will exit Java Basics - Anfänger-Themen 2
G exit sub in java? Java Basics - Anfänger-Themen 5
C System.exit(int) und andere ähnliche Befehle Java Basics - Anfänger-Themen 5
I Could not find the main class. Program will exit! Java Basics - Anfänger-Themen 3
E bedeutung d. übergabewertes bei System.exit Java Basics - Anfänger-Themen 2
X wie bekomme ich durch Eingabeaufforderung definierte double in einen Befehl, welcher 3 erwartete double braucht? Java Basics - Anfänger-Themen 3
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
Viktor A. Kaiser Ampelschaltung mit if-Befehl Java Basics - Anfänger-Themen 11
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
Lion.King switch-Befehl Java Basics - Anfänger-Themen 6
sserio Math. Befehl wird rot markiert Java Basics - Anfänger-Themen 5
F Terminal Windows per Befehl schließen? Java Basics - Anfänger-Themen 9
Y Wie kann man überprüfen, ob bei einem Print Befehl tatsächlich etwas geprintet wurde? Java Basics - Anfänger-Themen 4
H Befehl wird nicht ausgeführt - System.out.println Java Basics - Anfänger-Themen 3
A Scanner Befehl Java Anfänger Java Basics - Anfänger-Themen 8
K Subklassen mit einzigem Befehl addieren Java Basics - Anfänger-Themen 6
F cmd Befehl ausführen Java Basics - Anfänger-Themen 4
S Datenbank Befehl nach Login Java Basics - Anfänger-Themen 5
D Input/Output Befehl aus Benutzereingabe herausfiltern Java Basics - Anfänger-Themen 12
T if else Befehl funktioniert nicht richtig Java Basics - Anfänger-Themen 27
N Javac -version der Befehl ist entweder falsch geschrieben oder...... Java Basics - Anfänger-Themen 8
O Methoden Runtime.getRuntime().exec(befehl); Java Basics - Anfänger-Themen 6
L Ist an diesem Befehl irgendwas falsch? Java Basics - Anfänger-Themen 2
F Wieso wird dieser Befehl nicht ausgeführt? (Anfänger) Java Basics - Anfänger-Themen 2
B Copy Paste Befehl Java Basics - Anfänger-Themen 6
O String: Befehl und Wert erkennen. Java Basics - Anfänger-Themen 4
D Erste Schritte Zuul - 2ten Befehl einführen Java Basics - Anfänger-Themen 68
D Erste Schritte Befehl back implementieren Java Basics - Anfänger-Themen 18
elischa unbekannter Befehl zur Compilezeit Java Basics - Anfänger-Themen 22
B Befehl um ein Befehl abzubrechen Java Basics - Anfänger-Themen 2
M Classpath Befehl zum Kompilieren um die Option classpath erweitern. Java Basics - Anfänger-Themen 5
F Konsolen Befehl ausführen und Rückgabe auswerten Java Basics - Anfänger-Themen 3
S Befehl current: Java Basics - Anfänger-Themen 3
Silvascus Void Methode einem Stringparameter im syso-Befehl hinzufügen Java Basics - Anfänger-Themen 3
slejden Erste Schritte der Befehl import Java Basics - Anfänger-Themen 2
C OOP array Sortieren ohne den sort Befehl Java Basics - Anfänger-Themen 10
J Problem WIE ohne Goto-Befehl lösbar? Java Basics - Anfänger-Themen 6
N Benötige eine Alternative für einen GOTO Befehl Java Basics - Anfänger-Themen 2
O CMD Befehl javac Java Basics - Anfänger-Themen 3
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
D Klassenmethode: Befehl erkennen, dann int zurückgeben Java Basics - Anfänger-Themen 2
C Desktopiconwechsel ohne Befehl Java Basics - Anfänger-Themen 0
V Schlüsselworte Befehl Ignorieren? Java Basics - Anfänger-Themen 10
B JDK installieren Befehl java funktioniert nicht Java Basics - Anfänger-Themen 15
J Variablen Auf der suche nach einem Befehl Java Basics - Anfänger-Themen 2
M Frage zum return; Befehl Java Basics - Anfänger-Themen 1
C CMD Befehl + Variable im Java-Code ausführen Java Basics - Anfänger-Themen 8
S Methoden auf befehl ausführen Java Basics - Anfänger-Themen 7
iB0T Eine Art Goto Befehl! Java Basics - Anfänger-Themen 27
D Erste Schritte bash-Befehl mit Swing ausführen Java Basics - Anfänger-Themen 8
A Schlüsselworte Befehl this Java Basics - Anfänger-Themen 8
E CMD Befehl über Java ausführen? Java Basics - Anfänger-Themen 4
E Warum wird Methode nicht durch return-Befehl beendet? Java Basics - Anfänger-Themen 3
D Hilfe zu Java Befehl In.open Java Basics - Anfänger-Themen 2
B Javadoc-Befehl unter Ubuntu Java Basics - Anfänger-Themen 2
I Befehl/Methode "los()" Java Basics - Anfänger-Themen 17
A Befehl gesucht....wie komme ich an Folgendes Objekt? Java Basics - Anfänger-Themen 6
I Return Befehl in Methode Java Basics - Anfänger-Themen 13
K Befehl per Shell an Java-Applet JAR übergeben Java Basics - Anfänger-Themen 16
S javac Befehl Java Basics - Anfänger-Themen 7
C Befehl zum Verlassen einer Schleife Java Basics - Anfänger-Themen 27
W Befehl ausführen bei Mausklick + gedrückte Strg-Taste Java Basics - Anfänger-Themen 2
B Befehl mit Priorität aufrufen Java Basics - Anfänger-Themen 4
I Befehl wird erst nach dem Ausführen einer Funktion ausgeführt Java Basics - Anfänger-Themen 4
K Problem mit h2 DB Insert Befehl Java Basics - Anfänger-Themen 6
B Befehl für vorselektierten Radiobutton Java Basics - Anfänger-Themen 2
H if-Befehl mit Buttongroup Java Basics - Anfänger-Themen 9
B assert befehl in netbeans Java Basics - Anfänger-Themen 3
M Objekto.Programm. Return-Befehl Java Basics - Anfänger-Themen 4
F Kann String in Befehl wandeln? Java Basics - Anfänger-Themen 12
F Simpler DrawLine - Befehl!? Java Basics - Anfänger-Themen 9
M Befehl zum Einlesen von Benutzereingaben Java Basics - Anfänger-Themen 1
M Befehl zum Fenster schließen? GUI Java Basics - Anfänger-Themen 3
L Do while Befehl verkürzen? Java Basics - Anfänger-Themen 16
-horn- Befehl an CMD übergeben Java Basics - Anfänger-Themen 15
A [Fehlermeldung]Sleep-Befehl Java Basics - Anfänger-Themen 4
B Befehl "javac" wird nicht erkannt Java Basics - Anfänger-Themen 14
S Befehl "javac" funktioniert und Windows 7 nicht? Java Basics - Anfänger-Themen 3
K Terminal Befehl mit Java unter Mac ausführen Java Basics - Anfänger-Themen 18
L Java Persistence API - Update Befehl? Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben