我在 Unix(AIX 和 Linux)上运行了下面的 Java 代码,但它不起作用。如果我运行此代码,文件 q1.01 不会被压缩,并且我不会抛出任何异常(文件 q1.01 存在,我希望在命令运行后找到文件 q1.01.Z。)如果我输入“which compress”,命令提示符会报告“/usr/bin/compress”。如果我在 Unix 提示符下输入命令“/usr/bin/compress q1.01”,它就可以正常工作。关于可能出现问题的任何想法吗?
String cmd = "/usr/bin/compress q1.01";
Runtime.getRuntime().exec(cmd);
最佳答案
[后来编辑:问题出在最初的描述中; OP 传递的是通配符而不是 q.01。所以我下面的答案是错误的,除了粗体部分。我将其保留,以便后面的评论有意义。]
它尝试将 /usr/bin/compress
作为不带参数的程序名称运行。
Runtime.exec() 方法有多种形式。您正在使用.exec(String)版本,只接受可执行文件。相反,您需要使用 .exec(String[])数组版本,它采用 String[0] 中的可执行文件和 String[1..] 中的参数。
.exec() 需要一个字符串数组来传递参数。
尝试
String[] cmd = new String[] { "/usr/bin/compress", "q1.01" };
Runtime.getRuntime().exec(cmd);
请注意,.exec 不会调用本地命令 shell。这意味着我们必须在调用 .exec() 之前进行通配符扩展,甚至进行一些参数解析。这就是为什么您不能只将完整的命令行传递给它。
关于Unix 上的 Java 执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1049081/