2015-10-12 35 views
0

我想運行一個OSX命令是plutil轉換某些plist爲json格式。我在終端使用的命令是Java運行時執行與白色空間上的路徑名稱

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

錯誤我也都試過了,

  • 將在命令字符串
  • 改變陣列字符串命令撇號的建議我的幾個網站

,但他們的工作不。

如果我在安排我的命令或任何語法錯誤時做了任何錯誤,請指教。提前致謝。

+0

可能不是這裏真正發生了什麼,但也許事實上,「教程」拼寫錯誤?也許文件夾的拼寫有所不同。 – Arc676

+0

沒問題,空間是電腦的事情,它們是兩條不同的路徑。由於這些路徑不存在,所以會出現錯誤。 – bmarkham

+0

嗨@Arc676我有點改變命名,當我問這個問題,可能錯過了一些東西,但這不是問題..哈哈 – Chris

回答

1

呼叫Runtime.getRuntime().exec(cmdStr)是一個方便的方法的反彈 - 調用使用陣列的命令的快捷方式。它將命令字符串拆分爲空格,然後使用生成的數組運行命令。

所以,如果你給它一個字符串,其中的任何參數包含空格,它不會像貝殼做解析報價,只是打破它變成像這樣的部分:

// 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氣餒。

+0

感謝解決方案@RealSkeptic不知道我需要分隔每個參數/參數具有白色間距。 – Chris

1

試試這個

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

編輯:我忘記了我的第一篇文章

+0

hi @bmarkham我在做「無效的轉義序列(有效的是\ b \ t \ n \ f \ r \」\'\\)「錯誤,當我這樣做。 – Chris

+0

@Chris嘗試'temp \\ tutoral' – Arc676

+0

仍然無法使用@bmarkham,但RealSkeptic給出的答案效果很好! – Chris