java Runtime.exec(String[]) 平台独立吗?
-
22-08-2019 - |
题
我有一些运行命令的代码 Runtime.getRuntime.exec(字符串), ,并且它可以在 Windows 上运行。当我将代码移至 Linux 时,它崩溃了,修复它的唯一方法就是切换到 执行(字符串[]) 版本。如果我这样保留,代码在 Windows 和 Linux 上的工作方式是否相同,或者我应该在 Windows 上使用 exec(String) 而在 Linux 上使用 exec(String[]) ?
解决方案
使用的字符串[] 在两者。
我答案之前是的调试生产的软件运行在Windows的几个小时,苦不堪言的结果。
在了很多的努力,我们(I)来到之前贴溶液(使用的字符串[] 强>)
既然你有问题是在Linux上,我想用两个数组将是最好的。
顺便说一句。我想,方法与Java 1.4,从那时起一个新的类可用:的的ProcessBuilder 的上Java1.5的加入。我不知道那是什么一回事,但应该有它一个很好的理由。看看它和阅读的的Runtime.exec之间的区别是什么。也许这将是一个更好的选择。
,因为它们是建立在与外壳最后一些命令也不会平台上工作(无论是视窗CMD或bash / SH /等)如 DIR 或回波并且其中一些的。因此,我建议每个目标平台上做额外的/额外的测试,并添加异常处理程序不支持的命令。
:)
其他提示
好吧,我放弃了:你可以通过什么不平凡的命令给exec(),并期望获得在Windows和Linux的合理的结果?询问是否执行exec()是平台独立的种似乎缺少EXEC(),这是调用特定于平台的行为的整点。
要真正解决你的问题,是 - 该命令字符串被解释的方式将是在不同的平台不同的(和潜在的,对于不同的炮弹,在Linux上),并且使用String []版本更可能落得与参数获得通过正确。
用于拆分EXEC(字符串)参数为String []默认Tokeniser简单地通过空格字符并将它们拆分。它不解释引号像手动输入shell命令会,所以你应该叫的String []版本。但是,如果你在两个平台上使用Sun JDK,行为应该是相似的。
不过,由于Windows提供不同的shell命令其它的操作系统(例如复制,而不是CP),您的命令可能无法在所有平台上工作。
的exec()方法采用单个串,并且接受的阵列的一个之间的区别是,数组版本允许指定如何命令和它的参数需要被分解(即正确地) 。 当您使用接受只是一个字符串的方法将其分解成在空白的阵列的方法(一个或多个)。从此处理的处理相同的这两种方法。
这是从运行时类的代码,显示它是如何分解一个字符串到一个数组,然后调用字符串[]版本以继续处理。
public Process exec(String command, String[] envp, File dir)
throws IOException {
if (command.length() == 0)
throw new IllegalArgumentException("Empty command");
StringTokenizer st = new StringTokenizer(command);
String[] cmdarray = new String[st.countTokens()];
for (int i = 0; st.hasMoreTokens(); i++)
cmdarray[i] = st.nextToken();
return exec(cmdarray, envp, dir);
}
因此,其接受字符串的方法将不如果上whitspace打破的命令不能执行单独的命令和参数正常工作。
来自 [API][1]
此方法检查CMDARRAY是否是有效的操作系统命令。哪些命令有效是系统依赖性的,但至少该命令必须是非空字符串的非空字符串列表。
所以是的,它依赖于系统。顺便说一句,您能否发布相关代码,以便我们可以看到您(最终)做错了什么?
[1]: http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#exec(java.lang.String[], 、java.lang.String[]、java.io.File)
EXEC()调用底层操作系统本地命令。
专为Windows命令将无法在Linux上工作,将不得不重新编写。
如果你想运行使用类似下面的Windows和Linux不同的命令,你可以找出哪些操作系统正在运行:
String os = System.getProperty("os.name").toLowerCase();
if (os.indexOf("win") >= 0) {
// Windows Commands
} else {
// Linux Commands
}
另一个好处是写你的脚本是命令(.BAT的Windows下面的.sh用于Linux),而是调用这些脚本。