以空格作为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
,这都是行不通的,asStringTokenizer
不支持转义。此外,底层平台不应影响此处的技术。虽然ProcessBuilder
始终是更好的解决方案(而且您使用Path
是一个很好的建议),如果您能扩展这个答案,并说明当前尝试不起作用的原因,这也会很有帮助。@JasonC修复了这两个问题remarks@JasonC我提到了一个例子,其中参数是从命令prompt输入的。您的意思是javafoo“ab”
?
$ foo a b