BufferedReader读取较旧的输入

时间:2013-05-13 14:17:02

标签: 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 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条件并输出No valid input. Please try again。我认为这是因为有旧的输入(例如换行符号)飞来飞去。我怎样才能清理它?

2 个答案:

答案 0 :(得分:1)

问题似乎是您的输入序列:

尝试输入以下顺序:“a1 [enter]”。您的代码应该适用于此类输入。但是,如果输入“a [enter] 1 [enter]”,则代码应该失败。 原因是[enter]键仅在您执行下一个readline()时处理,并且它与数字格式不匹配,因此进入您的其他条件。

答案 1 :(得分:0)

过了一会儿,我终于找到了自己并重写了代码。它现在看起来如下并且完美地工作(至少对我而言):

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;
    }

我现在经常使用它们,但我仍然只是初学者,所以我可能会再次重写它们。