java getRuntime()。exec()不工作?

时间:2012-07-27 18:38:13

标签: java runtime exec

基本上,当我输入这些命令时 手工终端,sift程序工作并写一个.key文件,但是当我尝试从我的程序中调用它时,什么也没写。

我是否正确使用了exec()方法?我查看了API,似乎无法找出我出错的地方。

public static void main(String[] args) throws IOException, InterruptedException
{           
        //Task 1: create .key file for the input file
        String[] arr  = new String[3];
        arr[0] =  "\"C:/Users/Wesley/Documents/cv/final project/ObjectRecognition/sift/siftWin32.exe\"";
        arr[1] = "<\"C:/Users/Wesley/Documents/cv/final project/ObjectRecognition/sift/cover_actual.pgm\"";
        arr[2] = ">\"C:/Users/Wesley/Documents/cv/final project/ObjectRecognition/sift/keys/cover_actual.key\"";

        String command = (arr[0]+" "+arr[1]+" "+arr[2]);

        Process p=Runtime.getRuntime().exec(command); 
        p.waitFor(); 
        BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream())); 
        String line=reader.readLine(); 

        while(line!=null) 
        { 
            System.out.println(line); 
            line=reader.readLine(); 
        } 
}

5 个答案:

答案 0 :(得分:4)

您使用的命令行是DOS命令行,格式为:

prog < input > output

程序本身没有参数执行:

prog

然而,代码中的命令将作为

执行
prog "<" "input" ">" "output"

可能的修复:

a)使用Java来处理输入和输出文件

Process process = Runtime.getRuntime().exec(command);
OutputStream stdin = process.getOutputStream();
InputStream stdout = process.getInputStream();

// Start a background thread that writes input file into "stdin" stream
...

// Read the results from "stdout" stream
...

请参阅:Unable to read InputStream from Java Process (Runtime.getRuntime().exec() or ProcessBuilder)

b)使用cmd.exe按原样执行命令

cmd.exe /c "prog < input > output"

答案 1 :(得分:1)

您不能将重定向(<>)与Runtime.exec一起使用,因为它们是由shell解释和执行的。它只适用于一个可执行文件及其参数。

进一步阅读:

答案 2 :(得分:0)

您不能将输入/输出重定向与Runtime.exec一起使用。另一方面,同一方法返回一个Process对象,您可以访问其输入和输出流。

Process process = Runtime.exec("command here");

// these methods are terribly ill-named:
// getOutputStream returns the process's stdin
// and getInputStream returns the process's stdout
OutputStream stdin = process.getOutputStream();
// write your file in stdin
stdin.write(...);

// now read from stdout
InputStream stdout = process.getInputStream();
stdout.read(...);

答案 3 :(得分:0)

我测试,没关系。你可以试试。祝你好运

String cmd = "cmd /c siftWin32 <box.pgm>a.key"; 
Process process = Runtime.getRuntime().exec(cmd);

答案 4 :(得分:0)

*对于通常会导致问题的特殊字符: 即使使用以下文件名,此代码也能正常工作:“1 - Volume 1(Fronte).jpg”

String strArr[] = {"cmd", "/C", file.getCanonicalPath()};
Process p = rtObj.exec(strArr);///strCmd);

同意,此处不支持重定向。

在Windows 7上测试过 {guscoder:912081574}