当前位置: 首页 > 面试题库 >

路径名称上带有空格的Java Runtime Exec

呼延鹏云
2023-03-14
问题内容

我正在尝试运行一个OSPL命令,该命令是plutil,用于将某些plist转换为json格式。我在终端中使用的命令是

 plutil -convert json -o - '/Users/chris/project/temp tutoral/project.plist'

路径名称带有白色间距的此命令在我的终端中可以很好地运行,并且我的终端用单引号(“)覆盖路径名,但是问题在于在Java
Runtime.getRuntime().exec(cmdStr)下面运行此命令是我编写的代码

public static void main(String args[]){
        LinkedList<String> output = new LinkedList<String>();
        String cmdStr = "plutil -convert json -o - /Users/chris/project/temp tutoral/project.plist";
        //String cmdStr = " plutil -convert json -o - '/Users/chris/project/temp tutoral/project.plist'";
        //String [] cmdStr ={ "plutil -convert json -o - ", "\"Users/chris/project/temp tutoral/project.plist\""};

        Process p;
        try {
            p = Runtime.getRuntime().exec(cmdStr);
            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line = "";
            while ((line = reader.readLine()) != null) {
                output.add(line);
                System.out.println(line);
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

如果我运行此代码,它将给我一个错误

'Users/chris/project/temp: file does not exist or is not readable or is not a regular file (Error Domain=NSCocoaErrorDomain Code=260 "The file “temp” couldn’t be opened because there is no such file." UserInfo=0x7fd6b1c01510 {NSFilePath='Users/chris/project/temp, NSUnderlyingError=0x7fd6b1c01280 "The operation couldn’t be completed. No such file or directory"})
tutoral/project.plist': file does not exist or is not readable or is not a regular file (Error Domain=NSCocoaErrorDomain Code=260 "The file “project.plist” couldn’t be opened because there is no such file." UserInfo=0x7fd6b1d6dd00 {NSFilePath=tutoral/project.plist', NSUnderlyingError=0x7fd6b1d6c6b0 "The operation couldn’t be completed. No such file or directory"})

我也尝试过

  • 在命令字符串中放入撇号
  • 按我建议的几个站点更改数组字符串中的命令

但没有一个成功。

如果我在安排命令时发生任何错误或任何语法错误,请提出建议。提前致谢。


问题答案:

调用Runtime.getRuntime().exec(cmdStr)是一种便捷的方法-
使用数组调用命令的快捷方式。它在空白处分割命令字符串,然后对结果数组运行命令。

因此,如果您给它提供一个字符串,其中任何参数都包含空格,则它不会像shell一样解析引号,而只是将其分解为以下部分:

// Bad array created by automatic tokenization of command string
String[] cmdArr = { "plutil",
                    "-convert",
                    "json",
                    "-o",
                    "-",
                    "'/Users/chris/project/temp",
                    "tutoral/project.plist'" };

当然,这不是您想要的。因此,在这种情况下,应将命令分成自己的数组。每个参数在数组中都应该有其自己的元素,并且不需要为包含空格的参数加上引号:

// Correct array 
String[] cmdArr = { "plutil",
                    "-convert",
                    "json",
                    "-o",
                    "-",
                    "/Users/chris/project/temp tutoral/project.plist" };

请注意,启动过程的首选方式是使用ProcessBuilder,例如:

p = new ProcessBuilder("plutil",
                       "-convert",
                       "json",
                       "-o",
                       "-",
                       "/Users/chris/project/temp tutoral/project.plist")
       .start();

ProcessBuilder提供更多的可能性,并且Runtime.exec不鼓励使用。



 类似资料:
  • 问题内容: 如何执行路径名中包含空格的Java System(shell)命令? 我尝试将引号和反斜杠()放在一起,但这不起作用。 问题答案: 到目前为止,最可靠的方法是使用Runtime.exec(String [] cmdarray) 。 如果使用Runtime.exec(String command) ,则Java仅在空白处分割命令。 使用调用new StringTokenizer(comm

  • 我正在尝试运行一个OSX命令,它是plutil,用于将某些plist转换为json格式。我在terminal中使用的命令是 这个路径名为白色空格的命令在我的终端中运行良好,撇号(“)覆盖了路径名,但问题是在java的下面是我编写的代码 如果我运行此代码,它会给我一个错误 我也试过了, 在命令字符串中输入撇号 按照我的几个站点的建议更改数组字符串中的命令 但没有一个奏效。 如果我在安排命令时做错了什

  • 我有一个主文件,它使用(从主I do a source)一个属性文件,其中的变量指向路径。 属性文件如下所示: 问题是,我必须使用带空格的路径(我不能改变它)。 我试着用引号避开空白,但到目前为止没有解决方案。 我编辑了路径,单引号的问题是我在路径中使用了另一个变量

  • 我在一个web应用程序上工作,该应用程序从其代码中调用多个web服务客户端。 每个 Web 服务都有一些通用命名空间,但是当我生成每个客户端时,我目前正在将这些命名空间映射到不同的包 e. g. g. Web服务1的名称空间1- Web 服务 2 的命名空间1 - 其中namespace1引用相同的命名空间URL。 使用Wsdl2Java的namespace2package选项: 我可以毫无问题地

  • 我现在正在尝试将整个目录从一个集群镜像复制到另一个集群。但是当名称中有一个空格时,它失败了,我不知道如何解决这个问题,因为scp似乎认为我在复制多个文件。我正在使用一个变量来标记我需要的路径,所以添加反斜杠似乎不容易解决。 这是我正在使用的代码: 我试过单引号、双引号和单引号加双引号,都不行。有人能帮我解决吗?顺便说一下,代码中的mkdir语句是有效的。

  • 问题内容: 我正在尝试使用FileInputStream打开名称中包含空格的文件。 例如: 结果是抛出了FileNotFoundException。我试图对filePath进行硬编码,以仅查看是否应该转义空格字符,但它似乎没有用。关于这个问题有什么建议吗? 编辑:只是与每个人都在同一个页面上查看此问题…打开名称中没有空格的文件有效,具有空格的文件将失败。权限既不是这里的问题,也不不是文件夹分隔符。