Получение ввода и вывода из файла jar, запускаемого из класса java? - PullRequest
2 голосов
/ 14 февраля 2009

У меня есть JAR-файл, который запускает этот код:

public class InputOutput {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        boolean cont = true;
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        while (cont) {
            System.out.print("Input something: ");
            String temp = in.readLine();
            if (temp.equals("end")) {
                cont = false;
                System.out.println("Terminated.");
            }
            else
                System.out.println(temp);
        }
    }
}

Я хочу запрограммировать другой класс Java, который выполняет этот файл JAR и может получить входные данные и отправить выходные данные в него. Является ли это возможным? У меня есть текущий код, но он не работает:

public class JarTest {

    /**
     * Test input and output of jar files
     * @author Jack
     */
    public static void main(String[] args) {
        try {
            Process io = Runtime.getRuntime().exec("java -jar InputOutput.jar");
            BufferedReader in = new BufferedReader(new InputStreamReader(io.getInputStream()));
            OutputStreamWriter out = new OutputStreamWriter(io.getOutputStream());
            boolean cont = true;
            BufferedReader consolein = new BufferedReader(new InputStreamReader(System.in));
            while (cont) {
                String temp = consolein.readLine();
                out.write(temp);
                System.out.println(in.readLine());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

Спасибо за вашу помощь

Ответы [ 5 ]

2 голосов
/ 14 февраля 2009

Вам нужно запустить JAR-файл в другом процессе? Если нет, вы можете написать программу на Java, которая вызывает InputOutput.main (). В качестве альтернативы, если имя jar / класса известно только во время выполнения, вы можете создать новый загрузчик классов, загрузить указанный класс и вызвать main () посредством отражения.

Что касается перенаправления потоков ввода / вывода, вы можете использовать System.setOut, setIn, setErr.

1 голос
/ 14 февраля 2009
1 голос
/ 14 февраля 2009

Использование Runtime.exec зависит от платформы.

Если вы используете Windows, попробуйте добавить:

cmd /c

до

java -jar .... etc. et

Что-то вроде:

...getRuntime().exec("cmd /c java -jar InputOutput.... 

См. Также: Выполнить системный вызов и вернуть вывод stdout.

0 голосов
/ 24 апреля 2010

Вся необходимая информация о потоке ввода / вывода процесса содержится здесь: ссылка

0 голосов
/ 14 февраля 2009

Теперь, когда вы сказали, что вам нужно запустить его в другом процессе, вот проблема с вашим исходным кодом: у вас тупик.

запускаемый вами процесс запускается и быстро заполняет поток вывода и ошибок. JarTest необходимо регулярно читать их содержание. Поскольку вы делаете это в одном потоке, рано или поздно этот поток обнаружит, что данные будут доступны в одном потоке. На данный момент некому собирать данные из другого потока.

Следовательно, вы должны запустить выделенные потоки для сбора данных из стандартных потоков другого процесса.

...