Java BufferedReader读取旧的输入
这里是Java初学者。为了进行测试,我创建了自己的输入类,它使用BufferedReader。代码如下所示:Java BufferedReader读取旧的输入,java,newline,inputstream,bufferedreader,Java,Newline,Inputstream,Bufferedreader,这里是Java初学者。为了进行测试,我创建了自己的输入类,它使用BufferedReader。代码如下所示: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class inputter { private static BufferedReader read = new BufferedReader(new InputStream
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class inputter {
private static BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
/**
* @param
* A reader for chars
* @throws IOException
*/
public static char getChar() throws IOException{
int buf= read.read();
char chr = (char) buf;
while(!Character.isLetter(chr)){
buf= read.read();
chr = (char) buf;
}
return chr;
}
/**
* @param currencies, names
* A reader for Ints
* @throws IOException
*
*/public static int getInt()throws IOException{
String buf = read.readLine();
while(!buf.matches("[-]?(([1-9][0-9]*)|0)")){
buf = read.readLine();
System.out.print("No valid input. Please try again.");
}
return Integer.parseInt(buf);
}
/**
* @param currencies, names
* A reader for Floats
* @throws IOException
*
*/
public static float getFloat()throws IOException{
String buf = read.readLine();
while(!buf.matches("[-]?(([1-9][0-9]*)|0)(\\.[0-9]+)?")){
System.out.print("No valid input. Please try again.\n");
buf = read.readLine();
}
return java.lang.Float.parseFloat(buf);
}
}
它的问题是,每当我读取一个字符,然后尝试读取一个整数,它就会跳转到else条件并输出
无有效输入。请重试
。我认为这是因为有旧的输入(例如换行符)四处飞舞。我该如何清理它?问题似乎在于您的输入顺序:
尝试输入以下顺序:“a1[输入]”。您的代码应该适用于这种输入。但是,如果您输入“a[enter]1[enter]”,您的代码将失败。
原因是[enter]键仅在执行下一个readline()时处理,它与数字格式不匹配,因此进入else状态 过了一会儿,我终于自己找到了答案,重新编写了代码。它现在看起来如下所示,并且工作得非常完美(至少对我来说):
我现在经常使用这两种代码,但我还只是一个初学者,所以我可能会再次重写它们。您试过调试代码吗?我认为问题在于,不能将字符串(->char[])转换为char。可能读取缓冲区包含不可打印的字符?我不认为这是问题所在,因为它可以正常工作多次,并且当我只处理float和int时会打印错误消息。您如何输入?你输入的是“a”[输入键]“1”[输入键]?等等!typecast和类Float或Integer的解析方法之间有很大的不同!我知道。也许我不明白你的意思@法兰,是的,我就是这么做的。谢谢你的努力,但这不是问题所在。我找到了被窃听的序列。问题是新行仍保留在缓冲区中。while序列后面的一个简单read.readLine()完成了任务。public static char getChar()抛出IOException{String buf=read.readLine();char chr=(char)buf.charAt(0);while(buf.length()
public static char getChar() throws IOException{
String buf= read.readLine();
char chr = (char) buf.charAt(0);
while(buf.length() <= 1 && !Character.isLetter(chr)){
System.out.println("This is not valid input. Please try again.");
buf= read.readLine();
chr = (char) buf.charAt(0);
}
read.readLine();
return chr;
}
public static char getChar() throws IOException{
int buf= read.read();
char chr = (char) buf;
while(!Character.isLetter(chr)){
buf= read.read();
chr = (char) buf;
}
return chr;
}