Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Форматирование вывода getRuntime / 9 сообщений из 9, страница 1 из 1
21.06.2012, 12:06:55
    #37848124
Максим Н
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вывода getRuntime
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
			Process p = Runtime.getRuntime().exec(command, null);
			p.waitFor();
			message = Integer.toString(p.exitValue()) + "_";
			BufferedReader stdInput = new BufferedReader(new InputStreamReader(
					p.getInputStream()));
			BufferedReader stdError = new BufferedReader(new InputStreamReader(
					p.getErrorStream()));
			while ((s = stdInput.readLine()) != null) {
				message = message + s;
			}
			while ((s = stdError.readLine()) != null) {
				message = message + s;
			}


Ответ вызываемой программы записывается в переменную.
Когда вывожу эту переменную на экран, то теряются переносы строк.
Как сохранить формитирование?
...
Рейтинг: 0 / 0
21.06.2012, 12:26:31
    #37848181
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вывода getRuntime
readLine() читает строку без самого переноса.

Такая конкатенация в цикле - убивает производительсность в Java.
message = message + s;

Не могу понять почему ваш код вообще работает. p.waitFor(); блокирует поток, и никакая вычитка дальше не будет работать пока дочерний процесс не помрет.

Такие вычитки, обычно, делают в отдельных потоках.

В Java 7 ничего такого городить не нужно. Там есть методы redirect*, которые уже это реализуют.
В Java 6 есть другой метод redirect, который сливает IN и ERR вместе, так что их не нужно вычитывать по отдельности.
...
Рейтинг: 0 / 0
21.06.2012, 13:03:25
    #37848278
Максим Н
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вывода getRuntime
Blazkowicz,
Спасибо за ответ
авторНе могу понять почему ваш код вообще работает. p.waitFor(); блокирует поток, и никакая вычитка дальше не будет работать пока дочерний процесс не помрет. - блокирует на время выполнения внешней программы. Как только она отработает станет доступным лог выполнения.

авторТакая конкатенация в цикле - убивает производительсность в Java.
message = message + s; - Подскажите, как лучше сделать?
...
Рейтинг: 0 / 0
21.06.2012, 13:04:58
    #37848280
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вывода getRuntime
StringBuilder
...
Рейтинг: 0 / 0
21.06.2012, 13:06:38
    #37848286
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вывода getRuntime
Максим Нблокирует на время выполнения внешней программы. Как только она отработает станет доступным лог выполнения.
Это очень интересно, потому что обычно дочерний процесс просто зависает когда он пытается вывести что-то в консоль, но ваш Java код этого ещё не читает. Возможно, как-то вам повезло с процессом и у него жирный внутренний буфер.
...
Рейтинг: 0 / 0
21.06.2012, 13:10:35
    #37848300
Максим Н
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вывода getRuntime
BlazkowiczМаксим Нблокирует на время выполнения внешней программы. Как только она отработает станет доступным лог выполнения.
Это очень интересно, потому что обычно дочерний процесс просто зависает когда он пытается вывести что-то в консоль, но ваш Java код этого ещё не читает. Возможно, как-то вам повезло с процессом и у него жирный внутренний буфер.
С помощью этого кода я запускаю несколько внешних программок: sqlplus, архиватор и т.д. Пока работал нормально.
...
Рейтинг: 0 / 0
21.06.2012, 13:39:38
    #37848370
Максим Н
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вывода getRuntime
Убрал p.waitFor(); получил ошибку:
Код: java
1.
2.
3.
4.
Exception in thread "main" java.lang.IllegalThreadStateException: process has not exited
	at java.lang.ProcessImpl.exitValue(ProcessImpl.java:246)
	at jtest_class.execSqlplus(jtest_class.java:96)
	at jtest_class.main(jtest_class.java:170)
...
Рейтинг: 0 / 0
21.06.2012, 13:45:08
    #37848385
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вывода getRuntime
Максим НУбрал p.waitFor(); получил ошибку:
Код: java
1.
2.
Exception in thread "main" java.lang.IllegalThreadStateException: process has not exited
	at java.lang.ProcessImpl.exitValue(ProcessImpl.java:246)


Логично что если процесс не завершен, то и exit code у него отсутствует. Это к вычитке данных отношения не имеет.
...
Рейтинг: 0 / 0
21.06.2012, 13:47:33
    #37848391
Максим Н
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вывода getRuntime
BlazkowiczМаксим НУбрал p.waitFor(); получил ошибку:
Код: java
1.
2.
Exception in thread "main" java.lang.IllegalThreadStateException: process has not exited
	at java.lang.ProcessImpl.exitValue(ProcessImpl.java:246)


Логично что если процесс не завершен, то и exit code у него отсутствует. Это к вычитке данных отношения не имеет.
Туплю, спасибо
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Форматирование вывода getRuntime / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]