Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / PipedInputStream и другие стримы / 9 сообщений из 9, страница 1 из 1
13.01.2012, 13:12:45
    #37612856
_usa__83_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PipedInputStream и другие стримы
День добрый!

как прикрутить piped стримы к потокам ввода вывода внешнего процесса (Process.getOutputStream() - > PipedInputStream) ?
...
Рейтинг: 0 / 0
13.01.2012, 13:17:16
    #37612869
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PipedInputStream и другие стримы
Зачем?
http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html

авторHere is an example that starts a process with a modified working directory and environment, and redirects standard output and error to be appended to a log file:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 ProcessBuilder pb =
   new ProcessBuilder("myCommand", "myArg1", "myArg2");
 Map<String, String> env = pb.environment();
 env.put("VAR1", "myValue");
 env.remove("OTHERVAR");
 env.put("VAR2", env.get("VAR1") + "suffix");
 pb.directory(new File("myDir"));
 File log = new File("log");
 pb.redirectErrorStream(true);
 pb.redirectOutput(Redirect.appendTo(log));
 Process p = pb.start();
 assert pb.redirectInput() == Redirect.PIPE;
 assert pb.redirectOutput().file() == log;
 assert p.getInputStream().read() == -1;
 



Даже если у вас Java 6 - скачайте исходники и скопируйте себе в проект.
...
Рейтинг: 0 / 0
13.01.2012, 13:18:38
    #37612872
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PipedInputStream и другие стримы
Напрямую никак. Только ручным считыванием из Process.getOutputStream() и перекладыванием в свой InputStream.
...
Рейтинг: 0 / 0
13.01.2012, 13:22:18
    #37612885
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PipedInputStream и другие стримы
svenomНапрямую никак. Только ручным считыванием из Process.getOutputStream() и перекладыванием в свой InputStream.
Что ты этим имел ввиду? Piped Stream-ы как раз и нужны для перекачки в паралелльном потоке.
...
Рейтинг: 0 / 0
13.01.2012, 13:24:20
    #37612892
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PipedInputStream и другие стримы
BlazkowiczsvenomНапрямую никак. Только ручным считыванием из Process.getOutputStream() и перекладыванием в свой InputStream.
Что ты этим имел ввиду? Piped Stream-ы как раз и нужны для перекачки в паралелльном потоке.В смысле, что Piped стримы являются самыми нижними в иерархими стримов, они не могут декорировать другие стримы. Потому и отсутствуют соответствующие конструкторы.
...
Рейтинг: 0 / 0
14.01.2012, 17:43:44
    #37614574
_usa__83_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PipedInputStream и другие стримы
Blazkowicz,

Судя по ответу svenom прикрутить Piped'ы ко внешнему процессу (вводу, выводу) не удастся (я так тоже подумал именно про конструкторы), тогда как же все-таки избежать блокировки (блокирующие операции ввода вывода), Ваш ответ на другом форуме http://rsdn.ru/forum/java/2147887.1.aspx ?
...
Рейтинг: 0 / 0
14.01.2012, 18:00:51
    #37614586
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PipedInputStream и другие стримы
Не совсем понятно про какую болкировку вы говорите.
...
Рейтинг: 0 / 0
14.01.2012, 18:13:18
    #37614596
_usa__83_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PipedInputStream и другие стримы
svenom,

Ну вот тот самый пример http://rsdn.ru/forum/java/2145860.aspx:

public class proc {
static BufferedReader in;
static InputStream ins;
static PrintWriter out;


public static void main(String[] args) throws IOException, InterruptedException {
String path = "c:\\WINDOWS\\system32\\cmd.exe";
Runtime r = Runtime.getRuntime();
Process proc = r.exec(path);
ins = proc.getInputStream();

in = new BufferedReader(new InputStreamReader(ins));
out = new PrintWriter(new OutputStreamWriter(proc.getOutputStream()));

out.println("dir"); out.flush();

// Program hangs if one of these is executed here >>
//System.out.println(getResult1());
//System.out.println(getResult2());

out.println("exit"); out.flush();
// Another problem: program also hangs here... >>
//int code = proc.waitFor();

System.out.println(getResult1());
//System.out.println("Exit this " + code);
proc.destroy();
}

// Method 1
public static String getResult1() throws IOException {
String res = "";

// Method 1
int b;
while ((b = ins.read()) != -1) {
res += (char)b;
}

return res;
}

// Method 2
public static String getResult2() throws IOException {
String line, res = "";

while ((line = in.readLine()) != null) {
res += line + "\n";
}
return res;
}
}

т.е. блокируется вычитка пока есть куда писать, Blazkowicz сказал разместить в различных Thread'aх, я разместил, не помогло
http://www.sql.ru/forum/actualthread.aspx?tid=909263 ...

потом начал читать ветку на rsdn: http://rsdn.ru/forum/java/2145860.aspx и оттуда уже на PipedStream'ы свалился
...
Рейтинг: 0 / 0
14.01.2012, 22:37:03
    #37614826
_usa__83_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PipedInputStream и другие стримы
svenom,

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


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