关于启动过程的非法论证

时间:2012-11-07 02:05:30

标签: java android linux process runtime

我有一些控制台实用程序。我开始使用一些参数来执行此实用程序。一个参数是文件名。

如果filename不包含空格,则全部工作。但是对于空格我从实用程序中得到错误:“没有这样的文件或目录”。如果我设置文件名参数,仍然无法正常工作。但感兴趣的是:如果我从命令行调用实用程序(不是来自android / java),那么一切都有效。如果我替换%20上的空格,无论如何都不起作用:

1)filename(original):util dir \ some test.txt - not working(java,cmd)。这很正常。

2)filename(quates):util“dir \ some test.txt” - 在cmd中工作,在java中不起作用。

3)filename(encode):util“dir \ some%20test.txt” - not working(java,cmd)。

PS:实用程序是ffmpeg

4 个答案:

答案 0 :(得分:0)

在Java中使用dir\\some test.txtdir/some test.txt

请注意: \是Java中的特殊字符(转义)。如果您需要在示例中使用\作为字面值,则应该转义为\字符。

答案 1 :(得分:0)

当你启动程序时,每个空间都被注册为一个新的'arg',所以将它分成空格意味着程序认为有更多的args而不是按你想要的方式读取文件名。引号仅适用于CMD,因为语法旨在让它如此。你需要一个转义键尝试双反斜杠“\\”并在这里查看llegal-escape-character-followed-by-a-space

答案 2 :(得分:0)

我假设您尝试在Java中运行util "dir\some test.txt",如下所示:

System.exec("util \"dir\\some test.txt\"");

或类似的东西。如果是这样,那么问题就是简单的方式,exec方法将命令字符串拆分为参数。它只是将任何空白字符序列视为参数分隔符而不管引用。所以,上面实际上是传递util命令参数"dir\sometest.txt" ...这将导致它找不到文件。

处理此问题的最佳方法是使用传递字符串数组的exec重载; e.g。

System.exec(new String[]{"util", "dir\\some test.txt"});

记录:

  • util "dir\some test.txt"适用于CMD,因为CMD语言支持使用双引号引用。您可以使用POSIX shell执行类似操作。

  • util "dir\some%20test.txt"失败,因为CMD语言无法理解百分比转义。在URL中使用了百分比转义...除非有问题的命令需要URL参数,否则它会将%字符视为普通文件名字符。

最后,“随机”尝试不同类型的引用和转义并不是解决问题的好方法。在尝试解决问题之前,您应该尝试了解问题...

答案 3 :(得分:0)

我知道特殊的字符。我没有设置文件名手册。我有一些文件,使用getAbsoluteFile()并且所有反斜杠都可以。

我执行以下过程:

    ProcessBuilder pbuilder = new ProcessBuilder(cmd);
    Process proc = pbuilder.start();

其中cmd是我的命令: util filename

<强> UPD:

现在使用带有参数String []的ProcessBuilder。工作