[Java] keyboard input vanuit dos-box

Pagina: 1
Acties:

  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Momenteel ben ik bezig met een programma waarin je via een commandline bepaalde commando's kunt ingeven.

Wanneer ik dit programma run vanuit mijn JBuilder, kan ik zonder enig probleem de commando's ingeven in het console-venstertje.

Het probleem komt pas op wanneer ik van mijn programma een executable JAR-file maak en deze dan run in een dosbox via java -jar programma.jar.
Schijnbaar kan hij wel output tonen, maar input verwerken die via het keyboard komt doet hij niet.

Ik heb mij al zitten rot zoeken op internet (google, java.sun.com, ...), maar niets te vinden over dit probleem


Mijn commandLine() - object gebruikt een BufferedReader. Deze reader wordt geïnitialiseerd in de constructor van mijn commandLine()-object.

code:
1
reader = new BufferedReader(new InputStreamReader(System.in));


Verder heb ik dan ook de show()-method die de prompt zal tonen en commando's inleest en doorgeeft aan een parser:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public void show() throws IOException
  {
/**
 * @todo Pas nog het COMMAND-design patterns toe
 */
    System.out.print("> ");
    enteredCommand = reader.readLine();

    try
    {
      parser.parse(enteredCommand);
    }
    catch(SyntaxException se)
    {
      System.out.println(se.getMessage());
    }
    catch(IOException ioe)
    {
      ioe.printStackTrace();
    }
    finally
    {
      show();
    }
  }



Wanneer ik nu in mijn dosbox een commando ingeef, toont hij gewoon mijn prompt terug in plaats van het commando uit te voeren. :(

Moet ik misschien een andere soort Reader gebruiken?

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • RSchellhorn
  • Registratie: Augustus 2001
  • Laatst online: 23-08 12:41
Net Java boek uit de kast gepakt hier. Daar werken ze op precies de zelfde manier als jij, alleen dan laten ze input eerst in stukkies hakken door een Tokenizer.
(Zou er na de prompt een escape char staan ???)
Wat gebeurt er al laat je ook de volgende line printen?

"Ik heb zo veel soep gegeten, dat kan een mens niet aan. Ik heb zo veel soep gegeten, kan bijna niet meer staan. Ik zat daar maar te slurpen achter die grote kop en als ik bijna klaar was, dan schepten ze weer op!" (Hans Teeuwen)


  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Wat bedoel je met "zou er na de prompt een escape-char staan ? "

Het ingegeven commando wordt door de parser verwerkt. Pas nadat het commando verwerkt is, mag hij de prompt terug tonen.

voorbeeld van gewenste output:
> start
Server started
>

De tekst "server started" wordt door de parser getoond

werkelijke ouput (in dosbox):
>start
>

Het is dus waarschijnlijk zo dat de variable "enteredCommand" niets bevat en dus een lege string naar mijn parser wordt doorgegeven...

Het rare van dit probleem is dat hij het wel correct doet in de console-window van JBuilder (dus als ik er geen .jar file van maak en het niet run in dos)

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Nieuwe ontwikkeling in het probleem:

Na het programma verder te debuggen ben ik tot de constatie gekomen dat de applicatie wel degelijk de input binnenkrijgt.

De variabele 'command' wordt goed ingevuld en doorgegeven aan de parse()-method.
Het is nu juist in die method dat het verkeerd loopt:

Java:
1
2
3
4
5
6
7
public void parse(String command) throws SyntaxException, IOException
  {
    // splits het commando in COMMANDO en ARGUMENTEN
    components = command.split(" ");

    System.out.println("parsing: " + components[0]);
    ...


De System.out.println() wordt hier nu niet uitgevoerd, of tenminste, er wordt niets getoond (bij het uitvoeren van het app in een dosbox tenminste)

die components[] is toch een gewone String-array met als eerste element het commando dat je hebt ingetypt ?

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 10-07 04:13

PommeFritz

...geen friet

System.out is gebuffered. Het kan dus zijn dat jouw regeltje tijdelijk even niet getoond wordt omdat ie nog in de buffer zit. Doe eens een System.out.flush() vlak achter de println.

FireFox - neem het web in eigen hand


  • jkf
  • Registratie: Oktober 2000
  • Laatst online: 21-06-2025

jkf

Bovendien zou je bij een interactieve cli wel een buffer op in gebuiken?

P II 233 @ begane grond, rip (1997-2007), vervangen door vituele server uptime,


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Volgens mij flusht println altijd, maar print niet.

Of ben ik heel erg in de war met C :?

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Mitt3nz
  • Registratie: Maart 2002
  • Laatst online: 17-08 22:14
println flusht alleen automatisch als de juiste constructor van PrintWriter aangeroepen werd.

/edit: Deze dus:

public PrintWriter(OutputStream out, boolean autoFlush)

Create a new PrintWriter from an existing OutputStream. This convenience constructor creates the necessary intermediate OutputStreamWriter, which will convert characters into bytes using the default character encoding.

Parameters:
out - An output stream
autoFlush - A boolean; if true, the println() methods will flush the output buffer

[ Voor 73% gewijzigd door Mitt3nz op 09-02-2003 02:55 ]


  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Het probleem ligt volgens mij niet direct aan dat flushen hoor want in het console-output vnester van JBuilder werkt dat allmaal perfect.

'k Ga nog een beetje moeten verder debuggen waarschijnlijk :)

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.

Pagina: 1