Pourquoi ne peut-on pas lire les caractères un à un à partir du Système.dans?
Le programme suivant imprime chaque caractère écrit standard, mais seulement après qu'une nouvelle ligne a été écrit (au moins sur mon système!).
public class Test {
public static void main(String[] args) throws java.io.IOException {
int c;
while ((c = System.in.read()) != -1)
System.out.print((char) c);
}
}
Cela empêche les gens d'écrire des trucs comme "Appuyez sur une touche pour continuer" et les forces de quelque chose comme "Appuyez sur entrée pour continuer."
- Qu'est-ce que la raison sous-jacente pour cela?
- Est-il une limitation de Java?
- Est ce comportement dépendant du système (je suis sur Ubuntu)? Comment ça fonctionne sur Mac? Windows?
- Est dépendant du terminal en particulier je lance l'application dans? (Pour moi, il se comporte comme cela dans Eclipse et dans gnome-terminal)
- Est-il une solution?
- voir ma réponse dans stackoverflow.com/questions/1864076/...
Vous devez vous connecter pour publier un commentaire.
La plupart des terminaux de ligne est tamponnée par défaut, Java ne reçoit pas d'entrée jusqu'à ce qu'un saut de ligne.
Certains anciens de des bornes peut-être que la ligne de tampon d'entrée; qu'il doit être possible de désactiver la mise en mémoire tampon dans la plupart terminal moderne.
Oui.
Oui.
Il y a de la plate-forme de hacks.
curse
dans Linux et Unix-like plates-formes, et getch() dans Windows. Je ne suis pas au courant de la croix-plate-forme de façon.liées: Pourquoi "Appuyez sur une touche pour continuer" est une mauvaise idée:
Et après que toutes les lectures de Système.dans le même processus de lecture 1 caractère est de ne pas attendre pour EOL.
exec(new String[]{"/bin/sh","-c","stty -icanon min 1 </dev/tty"})
. Puis mettez dans unefinally
bloc pour réinitialiser l'indicateur:exec(new String[]{"/bin/sh","-c","stty icanon </dev/tty"})
voir ma réponse dans Fonction équivalente à C "_getch()" en Java?
}
System.in
tout si.