从Java运行其他程序

时间:2010-01-14 19:32:38

标签: java command-line runtime

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

svn log --xml -v > svn.log

java -jar example.jar arg1 arg2

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

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

由于

6 个答案:

答案 0 :(得分: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做一些事情。我只是复制并粘贴了代码,我不在乎它说的是什么。

答案 1 :(得分:3)

重定向>(与管道|一样)是一个shell构造,只有在通过/bin/sh(或等效的)执行内容时才有效。所以上面并没有真正发挥作用。你可以执行

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

并阅读svn.log

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

答案 2 :(得分:0)

而不是在命令中使用管道,只需让它打印到标准输出和错误输出。您可以从exec。

返回的进程对象中访问这些流

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分: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);
        }
    }