
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
10.01.2012, 13:52:41
|
|||
|---|---|---|---|
|
|||
Input и Output ... вешаемся |
|||
|
#18+
День добрый! Вопрос при полном не понимании работы ... streamo'v package test; import java.io.*; import java.lang.Runtime; import java.util.Arrays; import test.WinRegistry; public class Main { public static void main(String[] args) { String value=new String(); try { value=WinRegistry.readString(WinRegistry.HKEY_LOCAL_MACHINE,"Software\\PostgreSQL\\Installations\\postgresql-9.0","Base Directory"); value+="\\bin\\psql"; String[] s={value,"-U","postgres"}; Process proc=Runtime.getRuntime().exec(s); OutputStream stdin=proc.getOutputStream(); InputStream stdout=proc.getInputStream(); String line; BufferedReader outReader = new BufferedReader(new InputStreamReader(stdout)); stdin.write(new String("\\db").getBytes()); stdin.flush(); //stdin.close(); while (true) { line = outReader.readLine(); if (line==null) break; System.out.println(line); } stdin.write(new String("\\du").getBytes()); stdin.flush(); stdin.close(); while (true) { line = outReader.readLine(); if (line==null) break; System.out.println (line); } outReader.close(); proc.destroy(); } catch (Exception e) {System.err.println(e);} } } Если не закрыть поток вывода в программу, то и читать ответ не хочет, вешается на readline. (дурацкий вопрос, наверное ...) почему ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.01.2012, 14:02:27
|
|||
|---|---|---|---|
|
|||
Input и Output ... вешаемся |
|||
|
#18+
Потоки для чтения из внешних процессов надо читать в отдельных Threads. Когда вызывается операция чтения, она блокирует текущий поток и ждет данных от внешнего процесса. Если процесс ничего не пишет, то и поток не просыпается. Существует и обратная ситуация. Если внешний процесс пытается что-то записать, а писать ему некуда, потому что ваш код не читает. То он тоже блокируется. Подробно написано здесь http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html Посмотрите ещё ProcessBuilder. В Java 7 туда должны были добавить методы для параллельной вычитки, чтобы не писать свои. Как альтернативный workaround проблемы, если выхлоп вообще не важен, то можно запускать команды, через start cmd (под виндой), тогда ОС предоставит процессу место для выхлопа. Но вы уже не сможете его через класс Process. Так как это будет уже другой процесс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=59&mobile=1&tid=2132889]: |
0ms |
get settings: |
14ms |
get forum list: |
22ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
47ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 334ms |
| total: | 508ms |

| 0 / 0 |
