2010-07-24 11 views
1

j'ai un morceau de code qui appelle une instance de la borne de bash par l'utilisation de ce qui suit -Java.lang.Runtime

proc = Runtime.getRuntime().exec("/bin/bash", null, working-dir); 

et ensuite pour exécuter des commandes UNIX sur cette instance de bash appelé I « utilise un objet PrintWriter comme celui-ci -

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true); 

Je suis alors en utilisant l'objet PrintWriter pour exécuter effectivement les commandes dans le fashion-- suivant

out.println("pwd"); 
out.println("ls >a.txt"); 

Bien que les deux commandes semblent fonctionner parfaitement, j'ai un problème dans le cas où je construis une commande basée sur une entrée utilisateur. Être précis, je suis la construction d'une commande pour envoyer des fichiers à une imprimante sur le réseau et je le fais comme ça -

while ((strLine = br.readLine()) != null) { 
cmd= blah +blah +blah;//Construction of the command 
out.println(cmd); 
} 

Qu'est-ce qui se passe réellement dans le morceau de code ci-dessus est que br est lire à partir d'un fichier qui contient tous les fichiers qui doivent être imprimés, puis la chaîne ayant le nom du fichier va dans la commande et je l'écris sur l'objet PrintWriter.

Le problème auquel je suis confronté est que, je suppose qu'il y a une sorte de mise en file d'attente et que l'objet PrintWriter ne passe pas la commande à l'instance bash invoquée chaque fois qu'une commande est construite. Ainsi, à la fin de la journée, si 40 commandes sont en cours de construction, seuls 16 à 18 documents sont en cours d'impression. Je suppose que c'est parce qu'il envoie toutes les commandes à l'imprimante en une seule fois résultant de la perte. Je veux éliminer cette perte.

Des pointeurs?

Merci p1nG

+0

dépend si l'utilisateur exécute ce sudo ou non. – ping

Répondre

1

Essayez de mettre un out.flush() dans votre boucle. Cela va vider le tampon dans le BufferedWriter que vous avez créé.

Une autre astuce peut être d'éviter d'essayer d'utiliser un seul exec de bash pour toutes les commandes et de construire et exécuter la commande individuellement. Pensez à utiliser Process Builder au lieu de Runtime.exec().