Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Еще раз о Runtime.exec()

Поиск:
Нашёл альтернативный способ запуска программ из Java.

Предисловие:
В стандартном способе запуска программ, есть проблема, которая в официальной документации описывается так:
Цитата
Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.

Что в переводе означает
Цитата
Поскольку некоторые нативные платформы обеспечивают ограниченный размер буфера для потоков стандартного ввода и вывода, неспособность сразу написать в поток ввода или прочитать поток вывода у дочернего процесса, может вызвать его блокировку или даже застой.


Решение нашёл на JavaWorld (When Runtime.exec() won't) и немного переписал класс под себя. В зависимости от ситуации, удобно пользоваться и тем и другим, поскольку в большей части они похожи:
Код

package org.simanyay.jizer.kernel;

import java.util.*;
import java.io.*;

public class Executer {
   private List<String> err_output; // Error output
   private List<String> nor_output; // Normal output
   private int exit_value;
   
   private final int ARRAY = 1;
   private final int STRING = 2;
   
   public void execute(String cmd) throws Exception {
       genericExec(cmd, STRING);
   }
   
   public void execute(String[] cmd) throws Exception {
       genericExec(cmd, ARRAY);
   }
   
   private void genericExec(Object cmd, int type) throws Exception {
       Runtime runtime = Runtime.getRuntime();
       Process proc = null;
       
       if(type == STRING) {
           proc = runtime.exec((String) cmd);
       } else if(type == ARRAY) {
           proc = runtime.exec((String[]) cmd);
       } else throw new IllegalArgumentException();
       
       Streamer err_stream = new Streamer(proc.getErrorStream());
       Streamer out_stream = new Streamer(proc.getInputStream());
       
       err_stream.run();
       out_stream.run();
       
       exit_value = proc.waitFor();
   }

   public int getExitValue() {
       return exit_value;
   }
}

// Я выкинул из этого класса явное указание типа
// вывода (stdout или же stderr) поскольку в моей задаче это не требовалось.
// Добавить обратно труда не составит, тем более, что это есть в той статье
class Streamer extends Thread {
   private InputStream input;

   public Streamer(InputStream in) {
       input = in;
   }
   
   public void run() {
       try {
           BufferedReader reader = new BufferedReader(new InputStreamReader(input));
           String line = null;
           
           while((line = reader.readLine()) != null) {
               System.out.println(line);
           }
       } catch(IOException ioe) {
           ioe.printStackTrace();
       }
   }
}


Засим моя проблема запуска компилятора решена полностью. Благодарю за внимание.
Автор: simanyay
Сайт: http://www.simanyay.org






Просмотров: 4166

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную