从Java运行其他程序

我需要从我自己的Java程序运行其他几个程序,基本上我需要运行这些命令行语句。

svn log --xml -v > svn.log 

 java -jar example.jar arg1 arg2 

我需要在我自己的程序中使用从这些程序写入控制台的文本输出。 我已经尝试使用svn运行Runtime.getRuntime()。exec(),但它似乎没有做任何事情,因为它没有生成svn.log文件。 另外两个程序都需要在不同的地方调用,需要从一个文件夹内部调用svn行,并且需要从另一个文件夹调用java行。

关于如何解决这个问题的任何想法? 如果在Java中无法做到这一点,有没有办法在C#中做到这一点?

谢谢

这里:

 ProcessBuilder processbuilder try { processbuilder.directory(file); processbuilder.redirectErrorStream(true); process = processbuilder.start(); String readLine; BufferedReader output = new BufferedReader(new InputStreamReader(process.getInputStream())); // include this too: // BufferedReader output = new BufferedReader(new InputStreamReader(process.getErrorStream())); while((readLine = output.readLine()) != null) { m_Logger.info(readLine); } process.waitFor(); } 

我用过类似的东西。 你真的想用readLine做一些事情。 我只是复制并粘贴代码,我不在乎它说了什么。

重定向> (就像管道一样)是一个shell构造,只有当你通过/bin/sh (或等价物)执行东西时才有效。 所以上面并没有真正发挥作用。 你可以执行

 /bin/sh -c "svn log --xml -v > svn.log" 

并阅读svn.log

或者,您可以读取流程执行的输出并将其转储到文件中(如果需要将其转储到文件中,或者只是在读取时直接使用它)。 如果您选择此路由并单独使用stdout / stderr,请注意当您使用输出(stdout)时,您还需要使用stderr,并且同时使用,否则缓冲区将阻止(以及您生成的进程)等待您的进程消耗这个。 有关详细信息,请参阅此答案 。

而不是在命令中管道,只需让它打印到标准输出和错误输出。 您可以从exec返回的进程对象访问这些流。

对于svn的东西,使用java SVNKit API。

看到你的两个命令,为什么不直接从Java中执行它而不执行? 您可以将SVNKit用于svn部分,并直接在类路径中包含jar。

尝试这个

 public static void main(String[] args) { try { // Execute a command with an argument that contains a space System.out.println(args[0]); String[]commands = new String[]{"svn", "info", args[0]}; Process process = Runtime.getRuntime().exec(commands); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); StringBuilder builder = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { builder.append(line); builder.append(System.getProperty("line.separator")); } String result = builder.toString(); System.out.println(result); }catch(Exception e){ System.out.print(e); } }