当前位置: 首页 > 知识库问答 >
问题:

Java运行时执行器,路径名称上有白色空格

裴存
2023-03-14

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

 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"})

我也试过了,

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

但没有一个奏效。

如果我在安排命令时做错了什么或犯了任何语法错误,请提供建议。提前谢谢。

共有2个答案

戎鹏云
2023-03-14

试试这个

/Users/chris/project/temp\ tutoral/project.plist

编辑:我在我的第一篇文章中错放了反冲

巫化
2023-03-14

调用运行时。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" };

请注意,启动流程的首选方法是使用process Builder,例如:

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

ProcessBuilder提供了更多的可能性,并使用运行时。不鼓励执行。

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

  • 问题内容: 我正在尝试运行一个OSPL命令,该命令是plutil,用于将某些plist转换为json格式。我在终端中使用的命令是 路径名称带有白色间距的此命令在我的终端中可以很好地运行,并且我的终端用单引号(“)覆盖路径名,但是问题在于在Java 下面运行此命令是我编写的代码 如果我运行此代码,它将给我一个错误 我也尝试过 在命令字符串中放入撇号 按我建议的几个站点更改数组字符串中的命令 但没有一

  • 在此之前,我的应用程序总是编译和执行。我只是使用 运行时位于C:/Program Files/java和JAVA_HOME**上 这个应用程序来自TextPad,它使用类路径运行良好,执行良好。系统编译正常,但我的JAR文件无法执行 问题:它无法在运行时找到我的类路径(它在编译时工作得很好),给了我这个错误 类路径 .;C:\Program Files(x86)\java\jre7\lib\ext

  • 问题内容: 在OS X上,我试图执行.exec某些内容,但是当路径包含空格时,它将不起作用。我尝试用引号将路径引起来,转义空格,甚至使用\ u0020。 例如,这有效: 但是,如果有空间,这些都不起作用: 有想法吗? 编辑:转义的反斜杠…仍然没有用。 问题答案: 在Sun的论坛上有关于此问题的摘要…似乎是一个非常普遍的问题,不仅限于OSX。 该主题的最后一篇文章总结了建议的解决方案。本质上,使用带

  • 我似乎找不到任何关于在运行时扫描所有可用类(用于接口、注释等)是否仍然可行的信息,就像Spring、Reflections和许多其他框架和库当前所做的那样,面对与Jigsaw相关的类加载方式的更改。 编辑:这个问题是关于扫描实际的物理文件路径以查找类。另一个问题是动态加载类和资源。这是相关的,但不是重复的。 最新消息:Jetty项目已就此提出了一项标准化API的JEP提案。如果你有办法帮助实现这一

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