1

我有下面的 Java 代码在 Unix(AIX 和 Linux)上运行,但它不起作用。如果我运行此代码,则文件 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);
4

5 回答 5

2

[后来编辑:问题出在最初的描述中;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()之前进行通配符扩展,甚至是一些参数解析。这就是为什么您不能只将完整的命令行传递给它。

于 2009-06-26T14:37:21.390 回答
1

有几个问题。一个是我尝试过使用通配符,并且由于没有调用外壳程序,因此它们没有被扩展。另一个问题是我创建了非常小的测试文件,如下所示:“echo 'abc' >q1.01”。这个文件太小了,compress 无法进一步压缩它,所以不管它。(愚蠢的是,我认为当我在 shell 中输入命令时,我使用了不同的文件名,它确实进行了压缩。)

谢谢大家的回答。它确实有帮助!

于 2009-06-26T16:06:01.067 回答
0

您可能需要使用文件的绝对路径。不过,捕获输出以查看问题所在 - 请参阅此页面以获取有关如何执行此操作的信息。

于 2009-06-26T13:21:49.500 回答
0

这个网站或许能提供一些线索。

于 2009-06-26T13:22:38.377 回答
0

如果进程输入流为空,我怀疑 Java 甚至无法生成子进程。Process#exitValue() 返回什么?

我建议使用strace来查看系统调用级别实际发生的情况。实际的 exec() 参数和返回代码会特别有趣。

于 2009-06-26T15:01:41.840 回答