我有一些控制台实用程序。我开始使用一些参数来执行此实用程序。一个参数是文件名。
如果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
答案 0 :(得分:0)
在Java中使用dir\\some test.txt
或dir/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\some
和test.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。工作