繁体   English   中英

如何将字节数组写入进程构建器(Java)的OutputStream

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM