2016-03-30 1 views
0

je cours jdk sur Windows 7. J'essaie d'exécuter un logiciel externe (pocketsphinx_continous.exe) dans mon application java. Le logiciel s'exécute en permanence (pocketsphinx_continous.exe) et imprime quelques sorties à la console que j'aime lire par mon application Java.java: analyser la sortie d'exécuter la commande

si je lance « pocketsphinx_continous.exe » avec quelques params de la ligne de commande tout fonctionne bien et je vois la sortie du logiciel. Après avoir tué le processus, j'essaie de l'exécuter dans mon application Java. Mais java n'imprime aucune sortie sur la console.

Ceci est mon code:

public void start(){ 
    try { 

     Runtime rt = Runtime.getRuntime(); 
     String[] commands = {"D:/cmusphinx/pocketsphinx/bin/Release/x64/pocketsphinx_continuous.exe", "-hmm", "d:/cmusphinx/pocketsphinx/model/en-us/en-us", "-lm", "d:/cmusphinx/pocketsphinx/model/en-us/en-us.lm.bin", "-dict", "d:/cmusphinx/pocketsphinx/model/en-us/cmudict-en-us.dict", "-samprate", "16000/8000/48000", "-inmic", "yes"}; 
     Process proc = rt.exec(commands); 


     BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream())); 

     BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream())); 

     // read the output from the command 
     System.out.println("Here is the standard output of the command:\n"); 
     String s = null; 
     while ((s = stdInput.readLine()) != null) { 
      System.out.println(s); 
     } 

     // read any errors from the attempted command 
     System.out.println("Here is the standard error of the command (if any):\n"); 
     while ((s = stdError.readLine()) != null) { 
      System.out.println(s); 
     } 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Java ne s'imprime "Voici la sortie standard de la commande:" et rien de plus. Mais il ne va pas s'écraser, il fonctionne toujours sans aucune erreur. Il me semble que java attendra que la commande exécutée soit terminée jusqu'à ce qu'elle imprime quoi que ce soit. Mais le logiciel fonctionnera en permanence et imprimer quelques fois nouveaux résultats ...

Toutes les idées?

Meilleures salutations

Mike

+0

Essayez d'utiliser cette méthode 'public int read (char [] cbuf, int désactivé, int len) throws IOException' ici' while ((s = stdInput.readLine())! = Null) {'au lieu de' readLine' car peut-être que votre sortie n'est jamais terminée en '\ n'. – ACV

+1

Si ce programme est écrit en C ou C++, et éventuellement d'autres langues, par la sortie par défaut à un terminal se fait ligne par ligne, mais la sortie vers un fichier ou un tube est tamponnées - et ** Java utilise des tuyaux ** pour communiquer avec un processus enfant. Essayez 'yourcommandline | findstr .' à l'invite de commande; Si vous ne voyez pas la sortie, vous ne le verrez pas non plus dans Java. –

Répondre

1

Je vous suggère de faire ce qui suit:

Process p = null; 
    ProcessBuilder b = new ProcessBuilder("D:/cmusphinx/pocketsphinx/bin/Release/x64/pocketsphinx_continuous.exe -hmm d:/cmusphinx/pocketsphinx/model/en-us/en-us -lm d:/cmusphinx/pocketsphinx/model/en-us/en-us.lm.bin -dict d:/cmusphinx/pocketsphinx/model/en-us/cmudict-en-us.dict -samprate 16000/8000/48000 -inmic yes"); 
    try { 
     p = b.start(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    BufferedReader output = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line = null; 
    try { 
     while ((line = output.readLine()) != null) { 
      System.out.println(line); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

L'utilisation ProcessBuilder vous ne disposez pas de séparer les paramètres. Il suffit de copier la commande entière dans un String.

+0

'Runtime.exec' a également une surcharge pour toute la ligne, et des surcharges pour l'environnement et workingdir. La seule chose que vous pouvez faire avec 'ProcessBuilder' mais pas 'Runtime' est hériter ou rediriger stdin/out/err. –

+0

Cela ne fonctionnera pas non plus, il semble qu'il soit coincé dans la ligne "while ((line = output.readLine())! = Null) {". Il n'y a pas d'erreur et pas de sortie! – Mike

+0

Peut-être que l'application externe ne sort pas ligne par ligne. Ensuite, essayez 'read (char [] cbuf, int off, int len)' comme @ACV suggéré. –