Я новичок в 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) И я получил свой результат вовремя.




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 :. Но проблема все еще сохраняется.
Возможно, вам следует отредактировать свой вопрос и включить написанную вами версию C++.
Дочерний процесс, который записывает в поток ошибок, будет ждать, пока в буфере будет достаточно места для записи еще. Если вы не прочитаете поток ошибок, программа остановится, если он заполнится.