作为参数传递时转义文件名

时间:2013-01-03 11:45:01

标签: java string escaping

我的Java程序正在启动另一个进程并将文件的绝对路径作为命令行参数传递。路径可能包含空格。所以我在将它添加到参数之前引用该路径。如果路径中出现双引号,我将使用\转义它。

以下是代码:

private String escapeQuotes(String original) {
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < original.length(); i++) {
        if (original.charAt(i) == '"') {
            builder.append('\\');
        }
        builder.append(original.charAt(i));
    }
    return builder.toString();
}

我喜欢它,

String args = " \"" + escapeQuotes(filePath) + "\"";

这很有效。但我想知道这种做法是否有傻瓜证明?或者还有其他我应该处理的事情,就像我逃脱双引号一样?

任何帮助都会很棒!

3 个答案:

答案 0 :(得分:1)

我认为你不需要这样做,例如

Runtime.getRuntime().exec(new String[] {"cmd", "/c", "dir", "d:/test ;test"})

工作正常,请注意“f:/ test; test”包含bot''和';'

答案 1 :(得分:1)

您是如何启动其他流程的?如果您使用的是version of Runtime.exec that takes an array,那么就不需要在任何参数中转义空格。

e.g。

Runtime.getRuntime().exec(new String[] { "notepad.exe", 
    "c:\path with spaces\afile.txt" });

答案 2 :(得分:1)

根据我在帖子下的评论:恕我直言,该方法不是傻瓜证明,因为它也会逃脱已经转义的引号。我会用:

private String escapeQuotes(String original) {
    return original.replaceAll("(?<!\\\\)\"", "\\\\\"");
}

然后

System.out.println(escapeQuotes("Not escaped\", escaped\\\""));

打印

Not escaped\", escaped\"

在控制台中

,而您的版本将打印

Not escaped\", escaped\\"