2016-03-12 3 views
3

Я пишу приложение JAVA-Console. После того, как пользователь запустил банку, он должен получить командную строку, такую ​​как оболочка Linux, где он может вводить команды. Это то, что я никогда не программировал раньше. Обычно я пишу GUI или запускаю банку с некоторыми аргументами, которые анализируются.Приложение для командной строки Java с собственным приглашением

Основном У меня есть 2 вопроса:

  1. Есть ли сторонний-libary, который помогает чтению введенного пользователя из командной строки разборе команды и генерирующее приглашение? Для анализа аргументов, переданных в основном классе, я обычно использую CLI Apache Commons. Используется ли здесь полный или слишком лучший способ?
  2. Есть ли наилучшая практика для обеспечения «бесконечного ввода»? Все решения, которые я нашел, составляют 10 или более лет, например:

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    while(true){ 
        System.out.print("Enter String"); 
        String s = br.readLine(); 
    } 
    

    Является ли это еще лучшей практикой или сегодня существует лучший способ?

+1

«Вопросы просят нас, чтобы рекомендовать или найти книгу, инструмент, библиотека программного обеспечения, учебник или другой ресурс вне сайта выключены -topic для Stack Overflow, поскольку они, как правило, привлекают упрямые ответы и спам. Вместо этого [описать проблему] (http://meta.stackoverflow.com/questions/254393) и что было сделано до сих пор для ее решения ». – Siguza

+0

Каковы ваши проблемы с 2? Одно большое преимущество заключается в том, что он не полагается на какие-либо внешние библиотеки ... –

ответ

3

Я использую библиотеку jline2, то есть с этим это так просто, как:

InputStream inStream = new FileInputStream(FileDescriptor.in); 
    ConsoleReader reader = new ConsoleReader("App", inStream, System.out, null); 

    reader.setPrompt("> "); 

    reader.addCompleter(new FileNameCompleter()); 
    reader.addCompleter(new StringsCompleter(Arrays.asList(new String[] { 
      "cmd1", 
      "exit", 
      "quit", 
    }))); 

    String line; 
    PrintWriter out = new PrintWriter(reader.getOutput()); 

    while ((line = reader.readLine()) != null) { 
     if (line.startsWith("cmd1")) { 
      String[] cmd = line.split("\\s+"); 
      if(cmd.length < 2) { 
       out.println("Invalid command"); 
       help(out); 
      } else { 
       ... do work 
      } 
     } else if (line.equalsIgnoreCase("quit") || line.equalsIgnoreCase("exit")) { 
      break; 
     } else { 
      help(out); 
     } 
    } 

    // ensure that all content is written to the screen at the end to make unit tests stable 
    reader.flush(); 
+0

Я связался с jline2, именно это мне и нужно. – Daniel

1

Я также занимаюсь созданием приложения с помощью командной строки. Способ, которым я создал мой, - создать один класс под названием «command», который является суперклассом для всех команд. Сделайте 2 абстрактных метода, «выполнить» и «getName()».

Затем переопределите метод getName() в каждом дочернем классе команды, чтобы он возвращал команду, которую пользователь вводит в виде строки. (вам не нужно использовать getName(), любое другое имя метода будет работать, или вы можете переопределить toString(), но это не идеально, поскольку это не заставляет дочерний класс иметь собственную реализацию)

Иметь другой метод, называемый «выполнить», взять оставшуюся часть ввода команды (параметры) и логику для каждой команды.

Возьмите пользовательский ввод, затем вы можете просто попытаться сопоставить его с методом command.getName(), выполнив итерацию по списку всех команд вместо использования огромного раздела кода для кода. В противном случае это станет уродливым.

FWIW У меня есть класс консоли как Singleton, так что его можно легко получить из любой другой части приложения.

+0

Интересный способ обработки команд. Я попробую. – Daniel

Смежные вопросы