Процесс не возвращает свой вывод - PullRequest
0 голосов
/ 08 декабря 2018

Я написал простой AppleScript и пытаюсь вызвать процесс из Java, который будет использовать osascript для запуска реального скрипта.Сценарий кажется выполненным, но ничего не выводится.Я попытался запустить тот же сценарий из терминала, и он работал как положено - я получил вывод как {{300, 450}, {500, 500}}.

    public void macTest() throws ScriptException, IOException, InterruptedException {
        final String script= "tell application \"System Events\" to tell application process \"Eclipse\"\n" + 
                "   get {size, position} of window 1\n" + 
                "end tell";

        System.out.println(runProcess(String.format("osascript -e '%s'", script)));
    }

    public static String runProcess(String cmdline) throws IOException, 
    InterruptedException { 
        Process p = Runtime.getRuntime().exec(cmdline); 
        p.waitFor(); 
        try { 
            return readContents(p.getInputStream()); 
        } finally { 
            p.destroy(); 
        } 
    } 

    public static String readContents(InputStream inputStream) 
            throws IOException { 
        StringBuilder contents = new StringBuilder(); 
        BufferedReader reader = new BufferedReader(new InputStreamReader( 
                inputStream)); 
        try { 
            String line; 
            while ((line = reader.readLine()) != null) {
                contents.append(line).append("\n"); 
            } 
        } finally { 
            reader.close(); 
        } 
        return contents.toString().trim(); 
    } 

Кажется, что входной поток здесь пуст.Как мне получить выходные данные моего процесса в Java?

1 Ответ

0 голосов
/ 08 декабря 2018

Вызов системных процессов из Java может быть немного сложным: понять, что неявная многопоточность выполняется под:

  • В одной руке у вас есть Java-программа, работающая на JVM (один процесс).
  • С другой стороны, есть запущенный вами подпроцесс, который работает независимо от JVM.Этот процесс обязательно записывает данные в свой выходной поток и / или в свой поток ошибок (и, возможно, даже читает данные из своего входного потока, но это не так).

Вкратце: вы должнызапустите поток для чтения потока вывода подпроцесса (через ваш метод readContents), а другой - для чтения потока ошибок подпроцесса.И, как только они будут запущены, вы можете вызвать метод waitFor, чтобы заблокировать основной поток до завершения подпроцесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...