2013-07-31 4 views
3

Некоторые программы производят вывод в bash таким образом, что пользователь испытывает, как строки, которые изменяют значения, а не печатают строки (прокручиваются строки, чтобы показать весь изменяющийся вывод). Что называется этим феноменом? Как это достигается, например, в java-программе или сценарии bash. Как можно анализировать выходные данные? Это просто печать новых строк, но с использованием какой-то специальной функции?Bash non scrolling terminal output

вершина одна программы, которая использует это «явление» вывод данных используются


Okey курсоров.

Тогда как я могу разобрать их в java? Я попробовал этот код, но он ничего

public static void exeTest(String [] args) throws IOException{ 
     if (args.length <= 0) { 
      System.out.println("empty command"); 
      return; 
     } 

     Process process = new ProcessBuilder(args).start(); 
     InputStream is = process.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 


     System.out.printf("Output of running %s is:", 
      Arrays.toString(args)); 
     String line; 
     while ((line = br.readLine()) != null) { 
      System.out.println(line); 
     } 

не печатает Спасибо за все хорошие ответы, им теперь более знакомы на эту тему даже ты, я до сих пор не может разобрать вывод программы, как один из лучших в Java. Закройте этот вопрос и сделайте больше исследований о том, как разбирать это в java. Затем я могу начать еще один конкретный вопрос только для разбора вывода в java.

+1

http://en.wikipedia.org/wiki/Curses_%28programming_library%29 – devnull

+0

Такие приложения, как 'top', используют' curses' для достижения того, что вы описали. – devnull

ответ

3

Вместо печати целых строк (как println или печати %n), писать BackSpace символы (\b) или оголенный возврат каретки без символов перевода строки (\r), чтобы переместить курсор назад перед тем, что вы хотите напечатать более.

+0

(Просто не делайте в своей среде IDE, он может не поддерживать его;)) – MadProgrammer

+0

Это звучит как хакерское решение:/это действительно стандарт?: S вместо написания System.out.println (str) я пишу для str.length построить строку с x \ b \ b \ b ... затем str, а затем использовать System.out.print для перезаписи последней отпечатанной строки? как это можно разобрать? while (line.startswith (\ b)) удалить сначала ... например, как создать программу, которая анализирует использование процессора сверху и показывает его в swing gui (im не делает этого) –

+2

Это хакерское решение , но это стандартный способ для базовых программ командной строки. Все, что более сложно, требует библиотеки терминалов, например 'curses', которая почти наверняка переполнена. Нет стандартного кросс-платформенного способа «очистить» терминал или вернуться к предыдущим строкам. Выход не подходит для скрипирования экрана. – chrylis

0

Это можно сделать так, как вы говорите, я имею в виду печать новых линий. Представьте, что у вас есть петля:

String header = "Current val:"; 
String buffer = ""; 
for(int i = 0; i < val; i++) { 
    buffer = header + " " + i + "\n"; 
    buffer += (val - i) + "iterations left\n"; 
    //add other strings to buffer... 
    //Clear console here 
    //Print buffer 
} 

Таким образом, выход будет выглядеть статичным с изменением переменных.

Другим, более мощным способом является использование goto(x, y) подобных функций для точного управления выходными данными. Java не имеет этого в стандартном api, но есть библиотеки с ним. Java gotoxy(x,y) for console applications

+0

// Очистить консоль здесь как? «clear» (команда)? это как программа, как верх? –

+0

В этом проблема - консоль очистки зависит от ОС. – MGorgon

0

curses может использоваться для этого. Поиск «java curses» и «bash curses» дает хорошие результаты.


Java:

http://sourceforge.net/projects/javacurses/

What's a good Java, curses-like, library for terminal applications?

What's the best way to get text user-interfaces (ncurses-like) functionality in Java?

Для Bash:

https://code.google.com/p/bashsimplecurses/

+0

Спасибо, что ответили, моя главная проблема теперь заключается в разборе вывода курсора процесса, выполняемого java. когда я запускаю процесс, который я могу вызвать, getOutputStream, но нет ничего похожего на get cursor –

1

Поскольку вы отметили вопрос bash, я предполагаю, что вы используете linux/cygwin. Следовательно, вполне вероятно, что терминал совместим с ANSI. В этом случае вы также можете использовать ANSI escape sequences ...

e.g.:

echo -e "Hello world\rHi" 
# Produces "Hillo world" since the line is not cleared before printing "Hi". 
echo -e "Hello world\r\e[KHi" 
#produces "Hi" (prints "Hello world", goes to 1st column, clears to last column, prints "Hi") 
# For more details, refer above link. 

Если вам нужно, чтобы запустить его в цикле (который является наиболее очевидный случай), убедитесь, что либо

  1. Вы не переводом строки после строки сообщения, ИЛИ
  2. Вы вернуться вертикального перемещения курсора (из-за "\ п"), используя последовательность ANSI побег - "\ е [А" (или "\ е [<N> A", где N = число строк.)

ПРИМЕЧАНИЕ:

Этот код приведен выше, это команды bash. К сожалению, я не очень знакомы с синтаксисом Java, но, насколько мне известно,

  1. эхо будет получить переведены на System.out.println
  2. эхо без последнего символа новой строки можно было бы достичь с System.out.printf
  3. & \e относится к <ESC> характер (ascii = 27), может быть достигнуто с помощью \033 в строке java.