2010-01-14 85 views
2

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

svn log --xml -v > svn.log 

java -jar example.jar arg1 arg2 

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

如何去这个任何想法?如果这在Java中不可行,有没有办法在C#中执行它?

感谢

回答

3

这里:

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做些什么。我只是从代码中复制并粘贴,我不在乎它说了什么。

0

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

3

重定向>(类似于管道|)是一个shell构造,只有在通过/bin/sh(或等效项)执行内容时才有效。所以上述并不真正起作用。您可以执行

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

和阅读svn.log

或者,你可以阅读的过程中执行的输出,并转储到一个文件(如果你需要将其记录到文件中,或者只是使用它直接作为你读它)。如果您选择此路由并单独使用stdout/stderr,请注意,当您使用输出(stdout)时,还需要消耗stderr,否则缓冲区将阻塞(并且生成的进程)等待进程消耗这个。有关更多详细信息,请参阅this answer

+0

+1对于“>”,这是问题的共用源极(以及变量扩展) – OscarRyz 2010-01-14 21:41:15

0

看到你的两个命令,你为什么不直接从Java做的,不执行?您可以使用SVNKit作为svn部分,并将jar包直接包含在classpath中。

0

尝试此

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); 
     } 
    }