在下面的例子中,我正在尝试接受来自用户的单个字符输入,但是在运行程序时,我得到do..while循环执行多次。请参阅下面的程序结果。
如果有人可以帮我解决问题,如何解决这个问题?
import java.io.*;
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
char c;
// BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
DataInputStream in =new DataInputStream(System.in);
// Asking the user what to do with the application
do{
System.out.println("Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E' ");
byte b = in.readByte();
c = (char) b;
c = Character.toUpperCase(c);
if (c=='Y'){
System.out.println(c);
}
else if (c=='N') {
System.out.println(c);
}
else if (c=='E'){
System.out.println(c);
}
else{
System.out.println("Incorrect Entry, try again: "+c);
}
}while (c!='E');
}
}
init:
deps-jar:
compile:
run:
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E'
asdfgaf
Incorrect Entry, try again: A
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E'
Incorrect Entry, try again: S
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E'
Incorrect Entry, try again: D
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E'
Incorrect Entry, try again: F
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E'
Incorrect Entry, try again: G
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E'
Incorrect Entry, try again: A
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E'
Incorrect Entry, try again: F
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E'
Incorrect Entry, try again:
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E'
答案 0 :(得分:2)
使用DataInputStream可能不是处理您情况的最佳方法。
DataInputStream缓冲您键入的输入,这就是为什么您会收到带有循环的不需要的冗长消息。
请尝试使用扫描仪。 这是扫描仪的一个例子:
Scanner objScanner = new Scanner(System.in);
char c = objScanner.next().charAt(0);
System.out.println(c);
答案 1 :(得分:2)
使用System.in.read()而不是DataInputStream。
答案 2 :(得分:1)
DataInputStream
(InputStream
)基本上是二进制结构。如果要读取文本数据(例如从控制台),则应使用Reader。在源代码中有一个注释掉BufferedReader
。最好使用相同而不是DataInputStream
。你可以这样做,
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String input = in.readLine();
或者您可以使用DataInputStream.readLine()
,但由于某种原因已将其弃用。它建议使用BufferedReader.readLine()
。
您可以选择其他选项,例如Scanner。
答案 3 :(得分:1)
用于获取输入的User Scanner类。这是解决问题的好方法。
Scanner scan = new Scanner(System.in);
System.out.println(scan.next().charAt(0));
答案 4 :(得分:0)
由于这个帖子还没有接受过的答案,即使它真的很老,我还是会回答。对于仍想要解释的人。
使用"SCALE"
是最适合这种情况的。
扫描仪易于使用,并停止线程直到完成。您可以使用它,或者您可以创建一个新线程来保持当前线程的运行。
扫描仪的基本用法:
Scanner
"信"将在扫描仪中的空格之前返回所有内容。要仅找到第一个字母,请将字符串拆分为Scanner s = new Scanner(System.in) //Makes a new scanner with System.in
String letter = s.next(); //Use next to find the character typed
//Insert code using letter variable
,然后取第一个(第0个)数组。
最后,引自this thread about scanners
的好引用next()只能读取输入直到空格。它无法读取由空格分隔的两个单词。此外,next()在读取输入后将光标放在同一行。
nextLine()读取包含单词之间空格的输入(即,读取直到行尾\ n)。读取输入后,nextLine()将光标定位在下一行。
稍后,在查找多个单词时,请使用nextLine()而不是next()来获取完整字符串
答案 5 :(得分:-1)
可能在上面的执行示例中,您输入了“asdfgaf”,然后按下回车键。 因此,它将A,S,D,F ....作为输入一次输入一个字符。 你应该输入'y'或'n'或'e'(一次一个字符),然后按Enter键。
e.g 您是否要访问自己的帐户,如果是,请输入“Y”,或者如果要创建新帐户,请按“否”退出“E”: ÿ