Java Process无法通过Runtime.getRunTime()。exec()获取InputStream

try { String str; Process process = Runtime.getRuntime().exec("bash /home/abhishek/workspace/Pro/run"); InputStream isout = process.getInputStream(); InputStreamReader isoutr = new InputStreamReader(isout); BufferedReader brout = new BufferedReader(isoutr); while ((str = brout.readLine()) != null) { System.out.println(str); } } catch (IOException e) { e.printStackTrace(); } 

该代码有从进程中获取InputStream的问题,因为如果我从我的terminal运行Shell脚本它运行完全正常,但如果我像这样运行脚本,str始终为空,

我正在使用此代码将Shell脚本的输出直接input到Java中,而不是将脚本输出写入文件中

有没有其他办法可以做到这一点,或者我怎样才能解决问题使用目前的做法

Solutions Collecting From Web of "Java Process无法通过Runtime.getRunTime()。exec()获取InputStream"

我认为通过错误流返回的东西,所以你可以尝试从Process.getErrorStream()检查的东西。

您还应该等待创建的过程,以防止主程序在它之前完成。 使用Process.waitFor();

 public class TestMain { private static final String BASH_CMD = "bash"; private static final String PROG = "/home/abhishek/workspace/Pro/run"; private static final String[] CMD_ARRAY = { BASH_CMD , PROG }; public static void main(String[] args) { new Thread(new Runnable() { public void run() { BufferedReader reader = new BufferedReader(new InputStreamReader( System.in)); String command = null; try { while ((command = reader.readLine()) != null) { System.out.println("Command Received:" + command); } } catch (Exception ex) { ex.printStackTrace(); // failed to listening command } } }).start(); Process process = null; try { ProcessBuilder processBuilder = new ProcessBuilder(CMD_ARRAY); process = processBuilder.start(); InputStream inputStream = process.getInputStream(); setUpStreamGobbler(inputStream, System.out); InputStream errorStream = process.getErrorStream(); setUpStreamGobbler(errorStream, System.err); System.out.println("never returns"); process.waitFor(); } catch (IOException e) { throw new RuntimeException(e); } catch (InterruptedException e) { throw new RuntimeException(e); } } public static void setUpStreamGobbler(final InputStream is, final PrintStream ps) { final InputStreamReader streamReader = new InputStreamReader(is); new Thread(new Runnable() { public void run() { BufferedReader br = new BufferedReader(streamReader); String line = null; try { while ((line = br.readLine()) != null) { ps.println("process stream: " + line); } } catch (IOException e) { e.printStackTrace(); } finally { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } }).start(); } } 

编辑/home/abhishek/workspace/Pro/run如果它是一个shell,并在顶部添加以下行。

 #!/usr/bin/bash 

并给/home/abhishek/workspace/Pro/run所需的执行权限。

然后使用下面的行

 Process process = Runtime.getRuntime().exec("/home/abhishek/workspace/Pro/run"); 

现在,如果运行程序打印任何东西,你应该在输出中看到它。

你的代码看起来很好。 所以,我相信这个问题要么是你正在使用的命令行( bash /home/abhishek/workspace/Pro/run ),要么是你的脚本本身。

我建议你执行以下步骤:

  1. 尝试运行一些知名的命令,而不是你的脚本。 例如pwd 。 检查从输入流读取的代码是否正常工作。
  2. 现在尝试简化您的脚本。 创建刚刚运行相同pwd脚本run1 。 现在从java运行这个脚本,并看到它正在工作。 顺便说一句,你不必运行它作为bash yourscript 。 你可以直接运行它而不用bash前缀
  3. 如果所有这些工作都开始逐步从简单的脚本转移到真实的脚本。 我相信你会发现你的错误。 可能你的脚本不能启动一些环境相关的问题。

可能的问题是当你获得inputStram的时候子进程没有准备好

尝试

 Process process = Runtime.getRuntime().exec("bash /home/abhishek/workspace/Pro/run"); InputStream isout = process.getInputStream(); process.waitFor() 

尝试这样的事情:

 String[] runCommand = new String[3]; runCommand[0] = "sh"; runCommand[1] = "-c"; runCommand[2] = "bash /home/abhishek/workspace/Pro/run"; Process process = runtime.exec(runCommand); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = reader.readLine(); reader.close();