2010-11-09 17 views
4

J'ai 2 questionsInvoquer un shell unix du programme java? Lire et écrire un flux régulier de données et d'un tuyau unix du programme java

1) comment puis-je, j'invoque un shell unix d'un java. bibliothèque d'exécution pour exécuter une commande de ce type

Processus p = Runtime.getRuntime(). exec (commandes);

alias chat> biais

2) Comment puis-je lire et écrire à un tuyau unix un flux régulier de données à partir de Java. Dois-je faire tous les appels système comme écriture de lecture ouverte à un tuyau

Je veux essentiellement de reproduire cette commande

alias chat> biais

où le flux régulier de données PROCÉDERA de programme Java pour biaiser et non alias de chat.

+1

Vous pouvez lire http: //www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html – ahvargas

Répondre

1

Vous ne pouvez pas utiliser ">" directement dans une commande Runtime.exec(). Il n'aura pas l'effet escompté et ne redirigera pas la sortie vers le fichier.

Vous devez obtenir le flux d'entrée de votre processus et rediriger vers le fichier à écrire:

Process p = Runtime.getRuntime().exec(new String[] {"cat", "alias"}); 
InputStream in = p.getInputStream(); 
FileOutputStream fos = new FileOutputStream("yourFile"); 
// Write in into fos... 
// handle the process streams 

Je ne détaillent pas la méthode d'écriture, mais:

  • vous devez gérer les exceptions (IO)
  • vous devez consommer (au moins pour fermer) tous les flux de processus (erreur, entrée, sortie).
+2

* "Vous ne pouvez pas utiliser"> "dans une commande Runtime.exec()" *: Oui, vous pouvez. Pourquoi pensez-vous que vous ne pouvez pas le faire? – Grodriguez

+0

@Grodriguez: Je crois qu'il voulait expliquer que si vous mettez ">" dans une commande Runtime.exec(), il n'aura pas l'effet qu'il aurait dans un shell Unix. Bien sûr, vous pouvez utiliser ">" comme un caractère normal, ou invoquer/bin/sh comme dans votre réponse et lui passer ">". – sleske

+0

Si c'est ce qu'il voulait dire, il aurait dû le dire. Ne le devinons pas, n'est-ce pas? – EJP

3

Vous pouvez appeler un shell Unix comme si vous appeliez un autre programme. Utilisez l'option -c pour passer la commande à exécuter en tant que paramètre. Assurez-vous également d'utiliser la méthode exec(String[]), et non exec(String), pour éviter la commande étant tokenized dans le mauvais sens:

String[] cmd = {"/bin/sh", "-c", "/bin/cat alias > bias"}; 
Process p = Runtime.getRuntime().exec(cmd); 

lire et écrire de/vers le processus, obtenir l'entrée, de sortie et les flux d'erreur de l'instance Process vous venez de créer:

InputStream in = p.getInputStream(); 
InputStream err = p.getErrorStream(); 
OutputStream out = p.getOutputStream(); 

Puis lire/écrire sur ces cours d'eau comme d'habitude.

Notez que les flux sont nommés par rapport à l'application Java. Tout ce qui est écrit dans OutputStream est redirigé vers l'entrée standard du processus que vous avez créé. Tout ce qui est écrit par le processus de stdout/stderr est envoyé aux InputStream obtenus respectivement à p.getInputStream() et p.getErrorStream().

Référence: http://download.oracle.com/javase/6/docs/api/java/lang/Process.html

6

Depuis JDK7, il existe un moyen Convinience de le faire:

ProcessBuilder pb = new ProcessBuilder("cat", "alias"); 
File bias = new File("bias"); 
pb.redirectOutput(Redirect.appendTo(bias)); 
pb.start(); 

Référence: ProcessBuilder#redirectOutput