2016-06-19 3 views
-1

У меня есть некоторые проблемы. Когда я запускаю команду:Запуск командной строки в unix через Java

openssl md5 "./build/outputs/apk/myApp.apk" 

Получаю результат, который мне нужен, поэтому openssl отлично работает. Тогда мой код в Java:

String md5_cmd = "openssl md5 \"./build/outputs/apk/myApp.apk\""; 

String md5Str = obj.executeCommand(md5_cmd); 
String whichCmd = obj.executeCommand("which openssl"); //For testing executeCommand 

System.out.println(md5Str); //Not prints anything 
System.out.println(whichCmd); //Prints the result just Fine  

private String executeCommand(String command) { 

    StringBuffer output = new StringBuffer(); 

    Process p; 
    try { 
     p = Runtime.getRuntime().exec(command); 
     p.waitFor(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 

        String line = "";   
     while ((line = reader.readLine())!= null) { 
      output.append(line); 
     } 

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

    return output.toString(); 

} 

Итак, первая команда с «md5_cmd» не показывает какой-либо вывод, хотя, если я запускаю его непосредственно через командную строку его OK. Вторая команда с «whichCmd» работает так, как ожидалось. Вы можете посоветовать?

+0

Пожалуйста, обратите внимание, что этот код работает хорошо под Windows, но не на UNIX – Dim

ответ

1

Вместо выполнения команды с одной строкой

String md5_cmd = "openssl md5 \"./build/outputs/apk/myApp.apk\""; 

Команды с аргументами должны выполняться с помощью String []

String[] md5_cmd = {"openssl", "md5", "./build/outputs/apk/myApp.apk"}; 
+0

Не в случае 'Runtime.getRuntime(). Exec' – SerCe

+0

См. [Javadoc] (https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec (java .lang.String [])) – Sanjeev

+0

, пожалуйста, смотрите источники вместо этого, http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/68 7fd7c7986d/SRC/доля/классы/Java/языки/Runtime.java # l446. Или, если хотите, javadoc к другому методу https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec(java.lang.String) - точнее, command строка разбивается на токены, используя aStringTokenizer, созданный вызовом new StringTokenizer (команда) без дальнейшей модификации категорий символов. Токены, созданные токенизатором, затем помещаются в новый массив строк cmdarray в том же порядке – SerCe

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