1
votes

Comment ouvrir un fichier .exe avec un fichier .txt comme argument à l'aide de ProcessBuilder

Je mappe la sortie du fichier .exe vers mon application java. Certains fichiers .exe acceptent les arguments sous forme de fichier .txt. Si le fichier .exe ne nécessite pas de fichier .txt comme argument, j'obtiens la sortie de celui-ci lors de l'exécution en utilisant ProcessBuilder (). Start (). Mais s'il nécessite le fichier .txt comme argument, le fichier .exe ne donne aucune sortie. Le fichier .exe est généré à partir du programme 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();

L'exécution de la banque donne une sortie correcte, mais l'exécution de kmeans ne donne aucune sortie.


0 commentaires

3 Réponses :


3
votes

Je suppose que kmeans imprime un message d'erreur sur stderr mais vous ne lisez pas depuis process.getErrorStream () donc le message est perdu. Il y a au moins un problème ici:

"-irandom-n2048-d16-c16.txt"

Vous devez soit passer deux arguments:

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

Ou, si kmeans les accepte ensemble comme un seul, débarrassez-vous de l'espace:

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


0 commentaires

1
votes

Pour ajouter à ce que Kugelman a dit, en fonction de l'emplacement du fichier, vous devrez peut-être utiliser un chemin absolu.


0 commentaires

0
votes

essayez quelque chose comme ça, et assurez-vous que le fichier texte est à l'emplacement, j'espère que cela aide

au lieu d'écrire manuellement les E / S sur SYSTEM OUT, vous pourriez hériter avec le générateur de processus de la manière suivante

        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();


1 commentaires

Ce serait une meilleure réponse si vous expliquiez pourquoi cela aide. De plus, toutes ces lignes peuvent être remplacées par processBuilder. inheritIO () .