2015-10-12 2 views
0

Я пытаюсь запустить команду OSX, которая является plutil для преобразования определенного формата plist в json. Команда, которую я использую в терминалеJava Runtime Exec с белыми пробелами в пути Имя

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 и я могу изменить имя, когда я задаю этот вопрос, возможно, пропустил несколько вещей, но это не проблема. Haha – 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 не знал, что мне нужно отделить каждый аргумент/params, имеющий белый интервал. – Chris

1

Попробуйте

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

EDIT: Я неуместен люфт на моем первом посте

+0

hi @bmarkham Я получаю «Неверная escape-последовательность (допустимые - это \ b \ t \ n \ f \ r \" \ '\\) "ошибка, когда я это делаю. – Chris

+0

@Chris Попробуйте 'temp \\ tutoral' – Arc676

+0

все еще не работает @bmarkham, но ответ, который RealSkeptic дал хорошо! – Chris

Смежные вопросы