Как открыть файл .exe с файлом .txt в качестве аргумента, используя ProcessBuilder - PullRequest
1 голос
/ 27 марта 2019

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

Ответы [ 3 ]

3 голосов
/ 27 марта 2019

Я предполагаю, что kmeans печатает сообщение об ошибке на stderr, но вы не читаете с process.getErrorStream(), поэтому сообщение потеряно. Здесь есть как минимум одна проблема:

"-i random-n2048-d16-c16.txt"

Вам нужно либо передать два аргумента:

"-i", "random-n2048-d16-c16.txt"

Или, если kmeans примет их вместе как единое целое, избавьтесь от места:

"-irandom-n2048-d16-c16.txt"
1 голос
/ 27 марта 2019

Чтобы добавить то, что сказал Кугельман, в зависимости от того, где находится файл, вам, возможно, придется использовать абсолютный путь.

0 голосов
/ 27 марта 2019

попробуйте что-то вроде этого, и убедитесь, что текстовый файл в месте, надеюсь, это поможет

вместо записи ввода / вывода в 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...