Java exec. Возможно ли принудительное промывание?

Я новичок в java, поэтому мой вопрос может быть запутанным.

Я пытался запустить какой-то процесс из java. Это майнер xmr-stack. Я использую такой код:

package com.company;
import java.io.*;

public class Main {

    public static void main(String[] argv) throws Exception {
        try {
            String line;
            Process p = Runtime.getRuntime().exec( "D:\\xmr-stak.exe " +
                    /* some arguments */ );

            BufferedReader in = new BufferedReader(
                    new InputStreamReader(p.getInputStream()) );
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
            in.close();
        }
        catch (Exception e) {
            // ...
        }
    }
}

Идеально подходит для обычных вещей.

Но я столкнулся с проблемой, что у меня нет вывода через какой-то момент в xmr-stak. Насколько я понимаю, в какой-то момент это приложение создает дочерний процесс. И я не видел вывода, производимого этим дочерним процессом.

Но после очень долгой работы (10+ минут) я получил результат за все это время. Похоже, что какой-то выходной буфер переполнился. Теперь я хочу понять, как чаще получать требуемый вывод в java.

С другой стороны, я написал ту же логику на C++ (На основании этого вопроса SO arswer) И я получил свой результат вовремя.

Дочерний процесс, который записывает в поток ошибок, будет ждать, пока в буфере будет достаточно места для записи еще. Если вы не прочитаете поток ошибок, программа остановится, если он заполнится.

Peter Lawrey 22.07.2018 21:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
259
1

Ответы 1

Runtime.exec устарел. Вы можете заменить всю свою программу несколькими строками, в которых используется ProcessBuilder:

ProcessBuilder builder = new ProcessBuilder("D:\\xml-stak.exe",
    arg1, arg2, arg3);

builder.inheritIO();

Process p = builder.start();
p.waitFor();

Вам не нужно читать вывод процесса (и, следовательно, не нужно беспокоиться о буферизации), потому что наследованиеIO () заставляет этот вывод появляться в выводе вашей программы Java.

Вам также не нужно перехватывать какие-либо исключения, поскольку в вашем методе main уже есть throws Exception.

Я переписал это с помощью ProcessBuilder :. Но проблема все еще сохраняется.

Stepan Loginov 22.07.2018 22:50

Возможно, вам следует отредактировать свой вопрос и включить написанную вами версию C++.

VGR 23.07.2018 03:56

Другие вопросы по теме