2011-09-15 4 views
0

Lorsque je tente d'exécuter un programme externe de java j'utiliser ce code ci-dessous:programme externe de Java ne se termine pas

Process p; 
rn = Runtime.getRuntime(); 

String[] unzip = new String[2]; 

unzip[0]="unzip"; 

unzip[1]=archive ; 

public void dezip() throws IOException{ 

    p = rn.exec(unzip); 
    int ret = p.exitValue(); 

System.out.println("End of unzip method"); 

Mais mon dernier System.out est jamais exécuté, comme si nous sortons de la méthode unzip. L'appel unzip() fait seulement la moitié du travail, seulement une partie de mon archive est décompressée. Lorsque j'utilise ps -x ou htop à partir de la ligne de commande, je vois que le processus Unzip est toujours là.

Aide s'il vous plaît.

+0

Ce n'est pas un vrai copier/coller de votre code, n'est-ce pas? Vous parlez d'une méthode appelée 'unzip', est-ce' dezip'vous voulez dire? –

+0

Désolé, j'utilise linux donc unzip est une commande. [link] http://linux.about.com/od/commands/l/blcmdl1_unzip.htm – lemoos

Répondre

1

Vous devez probablement lire InputStream à partir du processus. Voir la javadoc de Process

qui stipule:

Parce que certaines plates-formes natives ne fournissent que la taille de la mémoire tampon limitée pour entrée standard et de sortie, l'échec d'écrire rapidement le flux d'entrée ou lire le flux de sortie du sous-processus peut provoquer le sous-processus à bloquer, et même le blocage.

+1

Vous devez ** certainement ** lire et vider les flux * Output * et * Error * du processus. Voir 'Process.getOutputStream' et' Process.getErrorStream' –

+0

Je ne comprends pas. J'appelle la méthode unzip et elle ne fait que la moitié du travail. Pourquoi ai-je besoin de flux? – lemoos

+0

Problème résolu! J'ai utilisé l'argument -qq pour un mode très silencieux pour la commande unzip. Et cela a fonctionné parfaitement. Vous aviez raison, c'était un problème de taille de tampon. – lemoos

0

S'il vous plaît essayez ce qui suit:

p = rn.exec(unzip); 
p.waitFor() 

J'espère que ça va changer quelque chose.

+0

Non, 'exitValue' attend la fin du processus fils. –

+0

Je l'ai déjà essayé. avec p.waitFor() j'ai le même problème. – lemoos

1

Vérifiez si la commande unzip demande quelque chose, peut-être un avertissement si le fichier existe déjà et si vous voulez l'écraser.

Aussi, est-ce une citation de retour que je vois au milieu d'un programme Java?

+0

non ce n'est pas une citation en retour, je ne suis pas très à l'aise avec l'éditeur de message de débordement de pile, donc je mets des guillemets pour mon code. – lemoos

1
  1. Assurez-vous que le programme externe n'attend pas pour l'entrée utilisateur
  2. Vérifiez si le chemin du fichier exécutable est cité lors du lancement sur les systèmes Windows pour gérer les répertoires avec des espaces ou des caractères spéciaux.

PS. J'utilisais la classe java.lang.Runtime mais j'ai trouvé que la classe java.lang.ProcessBuilder est de loin supérieure. Vous pouvez spécifier le répertoire de travail actuel et, plus important encore, l'environnement du système.

+0

mon programme externe n'attend pas une entrée de l'utilisateur. – lemoos

+0

L'exécution de commandes externes à partir de Java semble très facile mais elle est en réalité très loin de cela. Avez-vous essayé de rincer STDINT, STDOUT et STDERR? –