[英]How to write a byte array to OutputStream of process builder (Java)
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)始终为空。 如果我指定文件位置而不是流输入,我可以捕获输出。
我怎么能克服这个?
尝试使用BufferedInputStream()
和BufferedOutputStream()
包装您的流:
http://download.oracle.com/javase/6/docs/api/java/lang/Process.html#getOutputStream%28%29
实现说明:缓冲输出流是个好主意。
实现说明:缓冲输入流是个好主意。
即使使用缓冲流,如果你处理大量数据,缓冲区仍然可以填充,你可以通过启动一个单独的线程来读取q.getInputStream()
,这样你仍然可以阅读在写入流程的过程中。
也许您执行的程序只有在检测到输入数据结束时才会开始工作。 这通常通过等待EOF(文件结束)符号来完成。 您可以通过关闭流程的输出流来发送:
q.getOutputStream().write(bytes);
q.getOutputStream().close();
与等待过程一起尝试。
我想,你必须等待,直到这个过程结束。 我用这种方式实现了这样的东西:
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;
}
}
我刚刚删除了一些您不需要的特定代码,但它应该可以使用,试一试。 问候
我不知道其他的东西是否也可能出错,但是其他过程(“过程”)甚至没有时间回应,你没有等待它(可用的方法()不会阻止)。 可用() 多次在两者之间短暂停尝试了这一点,你可以冲洗(后先插入一个sleep(2000)),以及是否工作,你应该切换到query'ing q.getInputStream()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.