Я сопоставляю вывод из файла .exe с моим java-приложением. Некоторые файлы .exe принимают аргументы в виде файла .txt. Если файлу .exe не требуется файл .txt в качестве аргумента, я получаю вывод из него во время работы с помощью ProcessBuilder().start(). Но если в качестве аргумента требуется файл .txt, файл .exe не дает никакого вывода. Файл .exe генерируется из программы c.
Process process = new Process() {
@Override
public OutputStream getOutputStream() {
return null;
}
@Override
public InputStream getInputStream() {
return null;
}
@Override
public InputStream getErrorStream() {
return null;
}
@Override
public int waitFor() throws InterruptedException {
return 0;
}
@Override
public int exitValue() {
return 0;
}
@Override
public void destroy() {
}
};
if (bench.equals("bank")) {
process = new ProcessBuilder("./ref/tinySTM/test/bank/bank", "-n"+thread_count, "-d20").start();
}
else if (bench.equals("kmeans")) {
process = new ProcessBuilder("./ref/stamp/kmeans/kmeans", "-m40", "-n40", "-t0.05", "-i random-n2048-d16-c16.txt", "-p"+thread_count).start();
}
else{
System.out.println("Error. Invalid benchmark "+bench);
System.exit(0);
}
BufferedReader input = new BufferedReader (new InputStreamReader(process.getInputStream()));
while ((op = input.readLine()) != null) {
System.out.println(op);
}
input.close();
Выполнение банка дает правильный вывод, но выполнение kmeans не дает никакого вывода.




Я предполагаю, что kmeans печатает сообщение об ошибке на stderr, но вы не читаете из process.getErrorStream(), поэтому сообщение теряется. Здесь есть как минимум одна проблема:
"-i random-n2048-d16-c16.txt"
Вам нужно либо передать два аргумента:
"-i", "random-n2048-d16-c16.txt"
Или, если kmeans примет их вместе как одно, избавьтесь от пробела:
"-irandom-n2048-d16-c16.txt"
Чтобы добавить к тому, что сказал Кугельман, в зависимости от того, где находится файл, вам может потребоваться использовать абсолютный путь.
попробуйте что-то вроде этого и убедитесь, что текстовый файл находится в этом месте, надеюсь, это поможет
вместо того, чтобы записывать ввод-вывод в SYSTEM OUT вручную, вы можете наследоваться с помощью построителя процессов следующим образом.
ProcessBuilder processBuilder= new ProcessBuilder("./ref/stamp/kmeans/kmeans", "-m40", "-n40", "-t0.05", "./ref/stamp/kmeans/kmeans/random-n2048-d16-c16.txt", "-p"+thread_count);
processBuilder.inheritIO();
Process process = processBuilder.start();
Это был бы лучший ответ, если бы вы объяснили, почему это помогает. Кроме того, все эти строки можно заменить на processBuilder.наследоватьIO().