【问题标题】:How to escape slashes in command line argument (file path) in Java?如何在 Java 中转义命令行参数(文件路径)中的斜杠?
【发布时间】:2015-06-13 21:49:22
【问题描述】:

请注意,我在 Windows 下使用 NetBeans 进行开发。我也在运行 JDK 1.8。

程序通过命令行接受一些参数。一个参数是文件路径。用户可以键入-i C:\test。我如何逃脱斜线?似乎没有什么工作正常。

public class Test {

    public static void main(String[] args) throws FileNotFoundException, ParseException {
        // Simulate command line execution
        String[] arguments = new String[] { "-i C:\test" };

        // Create Options object
        Options options = new Options();

        // Add options input directory path.
        options.addOption("i", "input", true, "Specify the input directory path");

        // Create the parser
        CommandLineParser parser = new GnuParser();

        // Parse the command line
        CommandLine cmd = parser.parse(options, arguments);

        String inputDirectory = cmd.getOptionValue("i");
        String escaped;

        // Gives error of "invalid regular expression: Unexpected internal error
        escaped = inputDirectory.replaceAll("\\", "\\\\");

        // This does not work
        File file = new File (escaped);
        Collection<File> files = FileUtils.listFiles(file, null, false);

        // This works
        File file2 = new File ("C:\\test");
        Collection<File> files2 = FileUtils.listFiles(file2, null, false);
    }
}

我尝试了 replaceAll,但就像代码中所说的那样,它无法编译并且返回一个无效的正则表达式错误。

我知道最佳实践是使用 File.separator,但老实说,我不知道如何将它应用于命令行参数。也许用户可能会键入一个相对路径。用户引用的文件路径也可以在任何驱动器上。

如何转义反斜杠以便我可以使用 FileUtils 遍历每个文件?

非常感谢您的帮助。

【问题讨论】:

  • 仅供参考,正斜杠 (/) 仅适用于 Java,例如new File("C:/dir/foo")

标签: java command-line escaping command-line-arguments slash


【解决方案1】:

更换你的替代品

escaped = inputDirectory.replaceAll("\\", "\\\\");

escaped = inputDirectory.replaceAll(Pattern.quote("\\"), Matcher.quoteReplacement("\\\\"));

由于您是在模仿程序中的参数,请考虑到

 "-i C:\test"

实际上是tab(即\t)在C:est之间

正确的方法是:

 "-i C:\\test"

【讨论】:

  • 谢谢。是的,即使我转义了字符串,在调试器中,ValueC:\testString valueC: emp。因此,我猜测 FileUtils 代码行会中断,因为它找不到与字符串值对应的目录。简而言之,replaceAll 没有转义反斜杠。我有哪些选择?强制用户使用双反斜杠?将代码中的反斜杠替换为正斜杠?
  • String[] arguments = new String[] { "-i C:\test" }; 更改为String[] arguments = new String[] { "-i C:\\test" };
【解决方案2】:

但老实说,我不知道如何将它应用到命令行 论据。

如果您的问题是如何传递命令行参数,您可以在 windows 命令提示符下使用 java 命令,如下所示。

cmd> java Test C:\test1

或者如果你想在项目属性下的 netbeans 中传递参数 -> 运行 然后在 arguments 字段中添加每个参数,如下所示。

【讨论】:

  • 谢谢。这很有帮助。我的一个问题是我知道File.separator 是最佳实践,因为它独立于操作系统。但我不知道如何将其应用于命令行参数,因为我无法控制用户键入的内容。
  • 或者,您可以简单地使用 / 代替 \,因为在 windows 和 linux 中 / 都可以。
猜你喜欢
  • 2013-07-11
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 2014-02-04
  • 2017-03-16
  • 1970-01-01
相关资源
最近更新 更多