Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Еще раз о Runtime.exec() 
:(
    Опции темы
Domestic Cat
Дата 2.7.2005, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Нашёл альтернативный способ запуска программ из 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();
        }
    }
}


Засим моя проблема запуска компилятора решена полностью. Благодарю за внимание.



--------------------

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0637 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.