gpt4 book ai didi

Java:通过 Runtime.getRuntime().exec() 转义操作系统相关调用的字符串的正确方法

转载 作者:行者123 更新时间:2023-11-30 04:01:46 26 4
gpt4 key购买 nike

在我的 Java 应用程序中,我需要调用另一个可运行的 jar。它看起来像这样:

String path_to_jar_file = "/path/to/app.jar";
String some_params = "-par1 -par2 -par3";

//-- perform system call
Process pr = Runtime.getRuntime().exec("java -jar " + path_to_jar_file + " " + some_params);

//-- echo output
BufferedReader input = new BufferedReader(
new InputStreamReader(pr.getInputStream())
);
String line = null;
while ((line = input.readLine()) != null){
System.out.println(line);
}

//-- wait until process is finished and get its exit code
int exitVal = pr.waitFor();

但是 path_to_jar_file 实际上是由用户提供的,因此该路径可能包含空格或其他内容。在 Windows 上,我可以直接引用它,如下所示:

Runtime.getRuntime().exec("java -jar \"" + path_to_jar_file + "\" " + some_params);

并且它有效。但令人惊讶的是,在 Linux 上它不起作用。 (没有抛出异常,没有任何回显,只是退出代码为1,表示错误)

奇怪的是,如果我在终端中输入这个命令(带引号),它就会起作用!但是,如果我通过 Runtime.getRuntime().exec() 调用它,它只能在没有引号的情况下工作。

我想到的唯一解决方案是使用 Apache Common 的 SystemUtils.IS_OS_WINDOWS :在 Windows 上,引用路径,在 Linux 上转义空格和其他符号。

但是可能有一些现成的解决方案吗?

最佳答案

我测试了你的代码,在 OSX 上遇到了与你相同的问题。

您的问题似乎与空格有关,我可以通过使用 ProcessBuilder 来解决该问题因为它与空格配合得更好。

    //Create and start process builder
ProcessBuilder builder = new ProcessBuilder("java", "-jar", path_to_jar_file, param1, param2, param3);
Process process = builder.start();

//Create reader to get error messages (Just in case you have another issue)
BufferedReader errinput = new BufferedReader(new InputStreamReader(
process.getErrorStream()));

//Print errors to the terminal/console
String s = null;
while ((s = errinput.readLine()) != null)
{
System.out.println(s);
}

以上代码适用于 Windows 和 OSX,Linux 的行为方式应与 OSX 相同。

完成后记得取出报错代码,因为它会锁定主线程。

关于Java:通过 Runtime.getRuntime().exec() 转义操作系统相关调用的字符串的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21812990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com