Как открыть файл .exe с файлом .txt в качестве аргумента с помощью ProcessBuilder

Я сопоставляю вывод из файла .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 не дает никакого вывода.

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

Ответы 3

Ответ принят как подходящий

Я предполагаю, что 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().

VGR 27.03.2019 05:57

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