Comment tuyau d'entrée d'un programme en Java avec bash
Mon programme Java est à l'écoute sur l'entrée standard:
InputStreamReader isReader = new InputStreamReader(System.in);
BufferedReader bufReader = new BufferedReader(isReader);
while(true){
try {
String inputStr = null;
if((inputStr=bufReader.readLine()) != null) {
...
}
else {
System.out.println("inputStr is null");
}
}
catch (Exception e) {
...
}
}
Maintenant, je veux de la pipe d'entrée de ce programme à partir de bash. J'ai essayé le suivant:
echo "hi" | java -classpath ../src test.TestProgram
Mais c'est juste l'impression de inputStr is null
un nombre infini de fois. Ce que je fais mal?
Edit 1: mise à Jour de question pour inclure plus de code /contexte.
Edit 2:
On dirait que je suis en train de vivre la même question que cette OP: Ligne de commande de la Pipe d'Entrée en Java
Comment puis-je corriger le programme pour que je puisse tuyau d'entrée pour les essais, mais l'exécution du programme permettra aux utilisateurs d'entrée sur l'entrée standard ainsi?
- Cela devrait fonctionner. Est que votre programme?
- Votre code a fonctionné parfaitement pour moi. Que faites-vous dans votre non-affiché le code?
- Aucune chance que le
test.TestProgram
vous êtes en cours d'exécution n'est pas celui que vous êtes à la compilation? - J'utilise
Scanner
au lieu deBufferedReader
- je doute que cela ferait une différence. - si le fragment est exacte, à l'aide du Scanner ne fera aucune différence.
- Je viens de tester votre programme avec votre code, mais Il est tout à fait correcte
- J'ai mis à jour la question d'inclure plus de code. Je suppose que la simplification n'était pas une bonne idée dans ce cas.
- Oh, ce que vous avez posté à l'origine n'est pas votre programme complet. Le
while
boucle fait une énorme différence. - Ouais, il n'était pas. Désolé à ce sujet!
Vous devez vous connecter pour publier un commentaire.
Il fixe. Après la tuyauterie d'entrée a été achevé,
readLine()
cesse de revenirnull
, de sorte que la boucle infinie gardé en boucle.La solution est de casser de la boucle infinie lorsque
readLine()
renvoie la valeur null.Vous avez
while(true)
, donc boucle infinie est ce que vous allez obtenir.L'ajout d'un
break
quelque part dans la boucle est un moyen pour résoudre ce problème. Mais il n'est pas de bon style, parce que le lecteur a à chasser autour de la boucle pour savoir si et quand il se termine.C'est beaucoup mieux pour rendre votre
while
déclaration de montrer clairement que la condition de sortie est:Je ne vois pas pourquoi l'extrait de code serait se comporter de cette façon. Je soupçonne que le problème est dans quelque chose que vous n'avez pas montré ...
Par exemple, la version de
echo
utilisez-vous? Le shell builtin? Le standard dans '/bin'? Certains funky sur votre chemin de recherche?Vous pouvez essayer certains des expériences simples pour déterminer si le problème est le shell de commande /niveau ou au sein de l'application Java; par exemple,
etc.
Si aucune de ces expériences de rendement des indices, post le vrai code source Java de un petit programme qui montre votre problème.
(Et comme @trashgod souligne à juste titre, vous pourriez avoir de "gros doigts" l'étape de génération, et être équipés d'une version du programme qui ne correspond plus à votre code source.)
Vous pouvez envisager d'utiliser des canaux nommés (fifo) pour permettre à la fois d'entrée normale, via le terminal de contrôle
/dev/tty
(ou/dev/stdin
) et les canalisations d'entrée par l'intermédiaire d'une entrée fifo.Voir: La redirection d'entrée de l'application (java), mais toujours stdin en BASH
J'aime le slim de la réponse, que j'ai tendance à le manipuler un peu différemment. c'est un modèle de base que j'utilise pour la lecture d'un flux de texte, ligne par ligne.
Si je suis la lecture d'un fichier, je le modifier légèrement, pour fermer le fichier comme ceci