Java Exec использовать перенаправление ввода - PullRequest
1 голос
/ 16 февраля 2012
String cmd=" D:/James/1 ASU/REU/senna-v3.0/senna/senna-win32.exe -posvbs < \"D:/James/1 ASU/REU/senna-v3.0/senna/tmp.tmp\"";

Process p2 = Runtime.getRuntime().exec(cmd);

Я хочу запустить приложение и вставить в него данные из текстового файла.Я попробовал описанное выше, и приложение запустилось, но приложение жаловалось и говорит, что <не является допустимым аргументом командной строки. </p>

недопустимый аргумент:

SENNA Tagger (POS - CHK - NER - SRL) (c) Ронан Коллоберт 2009

Как, черт возьми, перенаправить ввод сфайл?Мне также нужно прочитать поток вывода из приложения, что я и сделал:

p2.waitFor();
char[] cbuf = new char[1024];
BufferedReader processOutput = new BufferedReader(new InputStreamReader(p2.getInputStream()));
        processOutput.read(cbuf);
processOutput.read(cbuf);
System.out.println(new String(cbuf));

Я не хочу запускать программу и отправлять ввод текста из stdin.Я просто хочу запустить программу один раз, дождаться ее завершения и затем прочитать все выходные данные.Основная причина этого заключается в том, что приложению может потребоваться неопределенное количество времени для завершения, и я не хочу иметь дело с проблемой, что чтение будет блокироваться, если нет вывода и т. Д.

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

С Может ли Java Runtime.exec другая Java-программа, использующая stdin? и этот пост :

Вызовите метод Process.getOutputStream и подайте ваш ввод в возвращенный поток вывода.

... так это будет выглядеть так:

String cmd = "D:/James/1 ASU/REU/senna-v3.0/senna/senna-win32.exe -posvbs";
Process p2 = Runtime.getRuntime().exec(cmd);

String fileInput = "D:/James/1 ASU/REU/senna-v3.0/senna/tmp.tmp";

BufferedWriter bufferedwriter = new BufferedWriter(new OutputStreamWriter(p2.getOutputStream()));

BufferedReader br = new BufferedReader(new FileReader(fileInput));
String s = br.readLine();
while (s != null)
{
    bufferedwriter.write(s);
    s = br.readLine();
}
bufferedwriter.flush();

... и вы захотите заключить его в try / catch и, вероятно, присвоить FileReader переменной close() правильно в блоке finally.

0 голосов
/ 16 февраля 2012

Почему Java не предоставляет библиотеку, которая делает это, мне не под силу.Спасибо Джиму за то, что он определил, что мне нужны потоки для чтения, поскольку java любит делать все, что блокирует.

0 голосов
/ 16 февраля 2012

Взаимодействие с отдельным процессом в Java, выполненное правильно , включает запуск двух или трех потоков, по одному для каждого из stdin, stdout и stderr (при необходимости), и обработку операций ввода-вывода в потоке. Попытка сделать все это в основном потоке может привести к зависанию вашего основного потока или внешнего процесса. Например, если вы сначала прочитаете стандартный вывод процесса, и он требует ввода, все остановится. Если вы обрабатываете отправку входных данных первыми, а выходные данные заполняют внутренний буфер, внешний процесс остановится.

Запустите отдельный поток для каждого потока и выполните все операции ввода-вывода в потоке. Соедините основной поток с потоками ввода-вывода и внешним процессом для очистки после того, как все будет сделано.

...