1

基本上,当我在终端中手动键入这些命令时,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(); 
        } 
}
4

5 回答 5

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
...

请参阅:无法从 Java 进程(Runtime.getRuntime().exec() 或 ProcessBuilder)读取 InputStream

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

cmd.exe /c "prog < input > output"
于 2012-07-27T18:47:00.590 回答
1

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

进一步阅读:

于 2012-07-27T18:44:06.470 回答
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(...);
于 2012-07-27T18:48:44.997 回答
0

我测试,没问题。你可以试试。祝你好运

String cmd = "cmd /c siftWin32 <box.pgm>a.key"; 
Process process = Runtime.getRuntime().exec(cmd);
于 2013-05-30T16:13:33.540 回答
0

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

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

也同意,这里不支持重定向。

在 Windows 7 上测试 {guscoder:912081574}

于 2014-02-07T10:21:58.793 回答