2013-05-13 5 views
0

Java начинающий здесь. Для тестирования я сделал свой собственный класс ввода, который использует BufferedReader. Код выглядит следующим образом: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); 
    } 

} 

Проблема с ним всякий раз, когда я прочитал символ, например, и после этого попытаться прочитать целое, он переходит к состоянию и выходов No valid input. Please try again еще. Я предполагаю, что это связано с тем, что у нас есть старый вход (например, символ новой строки). Как я могу это очистить?

+0

Вы пытались отладить свой код? Я думаю, проблема в том, что вы не можете преобразовать строку (-> char []) int char. возможно, буфер чтения содержит непечатаемые символы? – desperateCoder

+0

Я не думаю, что это проблема, так как она работает многократно, и сообщение об ошибке печатается, когда Im работает только с float и int. – hellerve

+0

Как вы вводите ввод? Вы пишете что-то вроде «a» [введите ключ] «1» [ввести ключ]? – Farlan

ответ

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

Я использую оба регулярно, но я все еще только новичок, поэтому я могу переписать их обоих снова.

0

Похоже, что проблема ваша входная последовательность:

Попробуйте ввести следующую последовательность: "a1 [Enter]". Ваш код должен работать для такого ввода. Однако, если вы введете «a [enter] 1 [enter]», ваш код должен завершиться неудачно. Причина в том, что клавиша [enter] обрабатывается только тогда, когда вы выполняете следующую readline(), и она не будет соответствовать формату номера, поэтому переходит в другое состояние.

+0

Спасибо за ваши усилия, но это не проблема. Я нашел прослушиваемую последовательность. Проблема заключалась в том, что новая строка осталась в буфере. Простая read.readLine() за последовательностью while выполнила задание. – hellerve

+0

public static char getChar() throws IOException { \t \t Строка buf = read.readLine(); \t \t char chr = (char) buf.charAt (0); \t \t в то время как (buf.length() <= 1 && Character.isLetter (CHR)!) { \t \t \t System.out.print ("Это не действительный вход Пожалуйста, попробуйте еще раз. \ П."); \t \t \t buf = read.readLine(); \t \t \t chr = (char) buf.charAt (0); \t \t} \t \t read.readLine(); \t \t возвращение chr; \t} - действительный код. – hellerve

Смежные вопросы