2015-08-13 14 views
7

Jestem nowy w programowaniu, a robię aplikację, która jest uruchamiana w linii poleceń w trybie tylko. Zauważyłem, że mogę użyć BufferedReader do odczytu danych wejściowych z wiersza poleceń.Tworzenie poleceń dla aplikacji terminalowej w języku Java

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
    String Input = ""; 

while (Input.equalsIgnoreCase("Stop") == false) { 
     Input = in.readLine(); 
     //Here comes the tricky part 
    } 

    in.close(); 

Co Próbuję teraz zrobić, to znaleźć sposób, aby tworzyć różne „polecenia”, które można wykorzystać tylko wpisując je w wierszu poleceń. Ale te polecenia mogą być używane wielokrotnie. Czy muszę używać jakiegoś wzorca projektowego Command z ogromną instrukcją przełączającą (która nie wydaje mi się odpowiednia)? Chciałbym unikać używania dodatkowej biblioteki.

Czy ktoś z nieco większym doświadczeniem może mi pomóc?

+0

To byłby krótki, "statyczny" i źle konserwowany sposób na zrobienie tego. Aby zrobić to poprawnie, aby polecenia mogły być "dynamiczne" (z możliwymi flagami i takimi, opcjonalnymi parametrami), musisz przeczytać, jak stworzyć parser. Google to ... –

Odpowiedz

4

można spróbować coś takiego:

public static void main(String[] args) { 
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
    String input = ""; 
    try { 
     while (!input.equalsIgnoreCase("stop")) { 
      showMenu(); 
      input = in.readLine(); 
      if(input.equals("1")) { 
       //do something 
      } 
      else if(input.equals("2")) { 
       //do something else 
      } 
      else if(input.equals("3")) { 
       // do something else 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public static void showMenu() { 
    System.out.println("Enter 1, 2, 3, or \"stop\" to exit"); 
} 

Dobrą praktyką jest, aby utrzymać variables niższej obudowane.

Powiedziałbym również, że !Input.equalsIgnoreCase("stop") jest znacznie bardziej czytelny niż Input.equalsIgnoreCase("stop") == false, chociaż oba są logicznie równoważne.

0

Jeśli chodzi tylko o odczytanie parametrów programu, można po prostu dodać je za wywołaniem aplikacji Java i uzyskać do nich dostęp za pośrednictwem argumentu args głównej metody. Następnie możesz przechodzić przez tablicę i szukać flag akceptowanych przez Twój program.

+0

Nie, musiałbym móc z nich korzystać podczas pracy programu, więc nie sądzę, żebym mógł użyć argumentów, prawda? –

+0

Nie. Tak więc buforowany czytnik jest twoim wyborem. Chyba, że ​​chcesz użyć zewnętrznej biblioteki parsera. (W zależności od rozmiaru i profesjonalnej konserwacji twojego oprogramowania) – M47z3

1

Zacznijmy od nieskończonej pętli while dla programu.

while(true) { 
//code here 
} 

dodać if wykryć poleceń i kilka innych rzeczy.

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class Example { 
public static void main(String[] args) throws IOException { 

    while (true) { 
     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
     String command = ""; 

     command = in.readLine(); 



     // These are your commands. 
     if (command.equalsIgnoreCase("FirstCommand")) { 
      System.out.println("My first Command!"); 
     } else if (command.equalsIgnoreCase("SecondCommand") || command.equals("AlternativeSecondCommand")) { 
      System.out.println("My second command!"); 
     } else if (command.equalsIgnoreCase("ThirdCommand" + "ParameterOne")) { 
      System.out.println("Parameter one of command three!"); 
     } else if (command.equalsIgnoreCase("Stop") || command.equalsIgnoreCase("Exit") 
       || command.equalsIgnoreCase("Quit")) { 
      System.exit(0); 
     } else { 
      System.out.println("Error: Unknown Command"); 
     } 
    } 
} 
} 

po prostu dodaj więcej, jeśli instrukcje zawierają więcej poleceń.

Działa świetnie i jest bardzo łatwy w obsłudze dla początkujących. Spróbuj!

+1

Porównujesz łańcuchy z '==' ale nie powinieneś tego robić. zamiast tego użyj 'String # equals (String)'. –

+0

Ok, to było przez jakiś czas Grzech użyłem java. Kiedy zrobiłem mój pierwszy terminal w C++, użyłem ==;) –

+0

To całkiem w porządku! :) Można również rozważyć użycie equalsIgnoreCase, ale to już inna historia. –

Powiązane problemy