我需要从我自己的Java程序运行其他几个程序,基本上我需要运行这些命令行语句。
svn log --xml -v > svn.log
和
java -jar example.jar arg1 arg2
我需要在我自己的程序中使用从这些程序写入控制台的文本输出。我已经尝试使用svn运行Runtime.getRuntime()。exec(),但它似乎没有做任何事情,因为它没有生成svn.log文件。另外两个程序都需要在不同的地方调用,需要从一个文件夹内部调用svn行,并且需要从另一个文件夹调用java行。
有关如何解决此问题的任何想法?如果在Java中无法做到这一点,有没有办法在C#中实现?
由于
答案 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);
}
}