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.
3 Réponses :
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"
Pour ajouter à ce que Kugelman a dit, en fonction de l'emplacement du fichier, vous devrez peut-être utiliser un chemin absolu.
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();
Ce serait une meilleure réponse si vous expliquiez pourquoi cela aide. De plus, toutes ces lignes peuvent être remplacées par processBuilder. inheritIO () .