Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Input и Output ... вешаемся / 3 сообщений из 3, страница 1 из 1
10.01.2012, 13:52:41
    #37607532
_usa__83_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Input и Output ... вешаемся
День добрый!

Вопрос при полном не понимании работы ... 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.
(дурацкий вопрос, наверное ...) почему ?
...
Рейтинг: 0 / 0
10.01.2012, 14:02:27
    #37607548
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Input и Output ... вешаемся
Потоки для чтения из внешних процессов надо читать в отдельных Threads.
Когда вызывается операция чтения, она блокирует текущий поток и ждет данных от внешнего процесса. Если процесс ничего не пишет, то и поток не просыпается.
Существует и обратная ситуация. Если внешний процесс пытается что-то записать, а писать ему некуда, потому что ваш код не читает. То он тоже блокируется.

Подробно написано здесь
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

Посмотрите ещё ProcessBuilder. В Java 7 туда должны были добавить методы для параллельной вычитки, чтобы не писать свои.

Как альтернативный workaround проблемы, если выхлоп вообще не важен, то можно запускать команды, через start cmd (под виндой), тогда ОС предоставит процессу место для выхлопа. Но вы уже не сможете его через класс Process. Так как это будет уже другой процесс.
...
Рейтинг: 0 / 0
10.01.2012, 14:05:48
    #37607554
_usa__83_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Input и Output ... вешаемся
Blazkowicz,

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


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