powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Input и Output ... вешаемся
3 сообщений из 3, страница 1 из 1
Input и Output ... вешаемся
    #37607532
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый!

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

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

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

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

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


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