这篇记载BufferedRead类和Scanner类如何实现java Input,以及他们的注意事项和区别。
首先说说BufferedRead:
BufferedReader 对象创建后,我们便可以使用 read() 方法从控制台读取一个字符,或者用 readLine() 方法读取一个字符串。
public class Test{ public static void main(String[] args) throws IOException{ char c; String s; //创建一个BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); do{ c = (char)br.read();//读取一个字符 System.out.print(c+" "); }while(c != 'q'); do { s=br.readLine();//读取一个字符串 System.out.println(s); }while(!s.equals("quit")); } }
运行结果为:
gxnrun
g x n r u n
q
q
gxnrun
gxnrun
quit
quit
Process finished with exit code 0
接下来说Scanner:
创建Scanner对象后,在读取前我们一般需要 使用 hasNext 与 hasNextLine 判断是否还有输入的数据
但是在这里使用hasNext会产生一个问题:假如代码如下
public class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); // 从键盘接收数据 // next方式接收字符串 System.out.println("next方式接收:"); // 判断是否还有输入 if (scan.hasNext()) { String str1 = scan.next(); System.out.println("输入的数据为:" + str1); } scan.close(); } }
那么当我输入abcd efg时,efg并不会被读入,但如果将if改为while,那么输入完abcd efg,虽然abcd和efg被分成两次读入了,但是执行完后光标仍停留在下面等待下一个输入(即该while无法结束)。这个原因是当执行到hasNext()时,它会先扫描缓冲区中是否有字符,有则返回true,继续扫描。直到扫描为空,这时并不返回false,而是将方法阻塞,等待你输入内容然后继续扫描。所以该while循环的参数不会为false,成为死循环。
解决方法:
使用带有参数的重载方法,当扫描到的字符与参数值匹配时返回true,代码如下
public class Test{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); // 从键盘接收数据 // next方式接收字符串 System.out.println("next方式接收:"); // 判断是否还有输入 while(!scan.hasNext("#")) { String str1 = scan.next(); System.out.println("输入的数据为:" + str1); } scan.close(); } }
这样当我们输入"#"时,scan.hasNext("#")便会返回true,取反后变为false,循环就会结束。
接下来看看nextLine:
public class Test{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); // 从键盘接收数据 // nextLine方式接收字符串 System.out.println("nextLine方式接收:"); // 判断是否还有输入 while (scan.hasNextLine()) { String str2 = scan.nextLine(); System.out.println("输入的数据为:" + str2); } scan.close(); } }
这样输入gxn run 时,整一行会被一并读入,带空格,然而使用while时,hasNextLine仍会阻塞,且这次不能带参数,只能在循环内设置条件break出去
next()和nextLine的区别:
最后scanner中还有hasNextInt(),nextInt()和hasNextFloat(),nextFloat()等可以进行整数小数输入校验和读取的功能,在这类方法中,输入了不符合规定的数据(比如hasNextInt我输入了1.2或12en),便会返回false。