Как записать байтовый массив в OutputStream сборщика процессов (Java) - PullRequest
4 голосов
/ 25 февраля 2011
byte[] bytes = value.getBytes();
Process q = new ProcessBuilder("process","arg1", "arg2").start();
q.getOutputStream().write(bytes);
q.getOutputStream().flush();
System.out.println(q.getInputStream().available());

Я пытаюсь передать содержимое файла в исполняемый файл и записать вывод, но вывод (InputStream) всегда пуст.Я могу захватить вывод, если я укажу расположение файла, но не с потоковым вводом.

Как я могу преодолеть это?

Ответы [ 4 ]

2 голосов
/ 25 февраля 2011

Попробуйте обернуть ваши потоки BufferedInputStream() и BufferedOutputStream():

http://download.oracle.com/javase/6/docs/api/java/lang/Process.html#getOutputStream%28%29

Примечание по реализации: Хорошая идея для буферизации выходного потока.

Замечание по реализации: Рекомендуется буферизовать входной поток.

Даже с буферизованными потоками буфер по-прежнему может заполняться, если вы работаете с большими объемами данных, вы можете справиться с этим, запустив отдельный поток для чтения из q.getInputStream()так что вы все еще можете читать из процесса во время записи в процесс.

1 голос
/ 26 февраля 2011

Возможно, программа, которую вы выполняете, начинает свою работу только тогда, когда обнаруживает конец своих входных данных. Обычно это делается путем ожидания символа EOF (конец файла). Вы можете отправить это, закрыв поток вывода для процесса:

q.getOutputStream().write(bytes);
q.getOutputStream().close();

Попробуйте это вместе с ожиданием процесса.

0 голосов
/ 16 марта 2013

Я думаю, вам нужно подождать, пока процесс не закончится.Я реализовал что-то вроде этого следующим образом:

public class ProcessReader {

  private static final int PROCESS_LOOP_SLEEP_MILLIS = 100;
  private String result;

  public ProcessReader(Process process) {
    BufferedReader resultReader = new BufferedReader(new   InputStreamReader(process.getInputStream()));
    StringBuilder resultOutput = new StringBuilder();
    try {
        while (!checkProcessTerminated(process, resultReader, resultOutput)) {
        }
    } catch (Exception ex1) {
        throw new RuntimeException(ex1);
    }
    result = resultOutput.toString();
}

public String getResult(){
    return result;
}

private boolean checkProcessTerminated(Process process, BufferedReader resultReader, StringBuilder resultOutput) throws Exception {

    try {
        int exit = process.exitValue();
        return true;
    } catch (IllegalThreadStateException ex) {
        Thread.sleep(PROCESS_LOOP_SLEEP_MILLIS);
    } finally {
        while (resultReader.ready()) {
            String out = resultReader.readLine();
            resultOutput.append(out).append("\n");
        }
    }
    return false;
}

}

Я только что удалил какой-то определенный код, который вам не нужен, но он должен работать, попробуйте.Привет

0 голосов
/ 25 февраля 2011

Я не знаю, может ли что-то еще быть здесь не так, но другой процесс («процесс») даже не успевает ответить, вы его не ждете (метод available () не блокирует). Чтобы попробовать это, вы можете сначала вставить sleep (2000) после flush (), и если это сработает, вы должны переключиться на query'ing q.getInputStream (). Available () множественный раз с короткими паузами между.

...