Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以空格作为Java参数的文件路径_Java - Fatal编程技术网

以空格作为Java参数的文件路径

以空格作为Java参数的文件路径,java,Java,我想做的是 r.exec("xdg-open "+args[1]+"/QRCode.png"); 但是,如果args[1]包含空格,则它不会像预期的那样工作。我知道,对于shell脚本,可以使用“$path”来解决。但是我需要Java的解决方案。尝试将路径用引号括起来: r.exec("xdg-open \""+args[1]+"/QRCode.png\""); 假设r是运行时,为此,您必须使用exec版本,该版本采用String[]参数数组,以确保带空格的字符串被视为单个参数,例如: r.

我想做的是

r.exec("xdg-open "+args[1]+"/QRCode.png");

但是,如果
args[1]
包含空格,则它不会像预期的那样工作。我知道,对于shell脚本,可以使用
“$path”
来解决。但是我需要Java的解决方案。

尝试将路径用引号括起来:

r.exec("xdg-open \""+args[1]+"/QRCode.png\"");

假设
r
运行时
,为此,您必须使用
exec
版本,该版本采用
String[]
参数数组,以确保带空格的字符串被视为单个参数,例如:

r.exec(new String[]{"xdg-open", args[1]+"/QRCode.png"});
虽然您可能会像shell一样只传递一个带引号的字符串,但是
string
版本的
Runtime.exec
,它不识别带引号的字符串


Runtime
s使用
StringTokenizer
是您最初尝试失败的原因,因为它只是盲目地在空格处分割。

不要使用
Runtime.exec()
,使用
ProcessBuilder

final Path path = Paths.get(args[1], "QRCode.png").toAbsolutePath();

final ProcessBuilder pb = new ProcessBuilder("xdg-open", path.toString());

final Process p = pb.start();
另外,如果这是来自命令行,请不要忘记引用参数

这:

是带有两个参数的命令
foo
a
b
;这:

$foo“a b”


如果
r
运行时
,那么命令
foo
只有一个参数,
ab

将不起作用,因为字符串被默认的
StringTokenizer
打断,它不关心引号。什么是
r
Runtime
?我猜您是在基于UNIX的系统上运行此操作的,但您能确认吗?您可以使用
String.replaceAll()
将所有空格替换为
“\”
@AaronD,您可能是指
“\\\”
,但在任何情况下,如果
r
Runtime
,这都是行不通的,as
StringTokenizer
不支持转义。此外,底层平台不应影响此处的技术。虽然
ProcessBuilder
始终是更好的解决方案(而且您使用
Path
是一个很好的建议),如果您能扩展这个答案,并说明当前尝试不起作用的原因,这也会很有帮助。@JasonC修复了这两个问题remarks@JasonC我提到了一个例子,其中参数是从命令prompt输入的。您的意思是
javafoo“ab”
$ foo a b