Scanner类
Scanner类对于编程初学者来说,是非常熟悉的,几乎在每次进行数据输入的时候都会使用到它。那么,先来说说Scanner类。
Scanner 是 java.util 包中的一个类,用于获取 int、double 等基本类型和字符串的输入。这是在 Java 程序中读取输入的最简单方法,但如果您想要一种输入法用于时间是一种限制的场景,例如在竞争性编程中,它不是很有效。
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String str=scanner.nextLine();
System.out.println(str);
}
}
Input:
abc
Output:
abc
总结Scanner类:
- 要创建 Scanner 类的对象,我们通常传递预定义的对象 System.in,它表示标准输入流。如果我们想从文件中读取输入,我们可以传递一个 File 类的对象
- 要读取某个数据类型XYZ的数值,要使用的函数是nextXYZ()。例如,要读取一个short类型的值,我们可以使用nextShort()
- 要读取字符串时,我们使用的是nextLine()
- 要读取单个字符,我们使用 next().charAt(0)。next() 函数将输入中的下一个标记/单词作为字符串返回,charAt(0) 函数返回该字符串中的第一个字符
BufferedReader类
对于编程初学者来说,BufferedReader类相对来说会见的比较少,因为在刚开始学习的时候遇到的输入和输出基本都是那个样子的,也不用考虑代码的运行效率,都直接使用Scanner类即可。那么,接下来在来说说相对来说不太熟悉的BufferedReader类。
BufferedReader 类是 java.io 包中的一个类。作用是:从字符输入流中读取文本,缓冲字符,以便高效读取字符、数组和行。
BufferedReader 类相对于Scanner类来说,是比较复杂的,没有像Scanner类使用的那么方便,本文只对Scanner类和BufferedReader类进行区分,不对BufferedReader类进行展开讲述,详细资料可以看这里:Java中的BufferedReader类。
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
String str=bufferedReader.readLine();
System.out.println(str);
}
}
Input:
abc
Output:
abc
总结BufferedReader类:
- 可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。
- 通常,由 Reader 发出的每个读取请求都会导致对底层字符或字节流发出相应的读取请求。
- 因此,建议将 BufferedReader 包装在 read() 操作可能成本高昂的任何 Reader 周围,例如 FileReaders 和 InputStreamReaders。
- 使用 DataInputStreams 进行文本输入的程序可以通过将每个 DataInputStream 替换为适当的 BufferedReader 来本地化。
Scanner类和BufferedReader类的区别
分别介绍完了Scanner类和BufferedReader类,接下来,就来比较这两个类的区别。
有人说:我通过上面的两段代码以及他们的运行结果,并未发现有什么不一样的啊?难道他们两个还有你们打的区别吗?
这时候我就会说:要看上面我对这两个类的文字介绍,不能仅仅只看代码,从文字中就可以很容易观察出这两个类之间的区别,还是非常明显的。
在 Java 中,Scanner 和 BufferedReader 类是用作读取输入方式的源。Scanner类是一个简单的文本扫描器,可以解析原始类型和字符串。它在内部使用正则表达式来读取不同的类型,而另一方面BufferedReader类从字符输入流中读取文本,缓冲字符以提供对字符序列的有效读取。这段解释来自GeeksforGeeks。
Java 中 Scanner 和 BufferedReader 类之间的主要区别
- BufferedReader 是同步的,而 Scanner 不是。如果我们使用多个线程,则应该使用 BufferedReader。
- BufferedReader 的缓冲内存比 Scanner 大得多。
- 与 BufferedReader(8KB 字节缓冲区)相比,Scanner 有一个小缓冲区(1KB 字符缓冲区),但绰绰有余。
- BufferedReader 比扫描器快一点,因为扫描器解析输入数据,而 BufferedReader 只是读取一个字符序列。
其实总结出来就是比较重要的两点:
第一点:
使用BufferedReader的运行效率比使用Scanner高(一般来说,很可能对快个十倍甚至二十倍)
第二点:
使用Scanner类示例代码:
public class Mian {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("输入一个整数");
int a=scanner.nextInt();
System.out.println("输入一个字符串");
String str=scanner.nextLine();
System.out.println(a+str);
}
}
运行框:
输入一个整数
123
输入一个字符串
123
发现:当输入一个数据的时候,还来不及输入第二个数据,代码就马上输出了。
使用BufferedReader类示例代码:
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
System.out.println("输入一个整数");
int num=Integer.parseInt(bufferedReader.readLine());
System.out.println("输入一个字符串");
String str=bufferedReader.readLine();
System.out.println(num+str);
}
}
运行框:
输入一个整数
123
输入一个字符串
abc
123abc
发现:结果不会像使用Scanner类那样,BufferedReader类是可以把第二个数据也完整给输入完毕后,再把结果给输出出来。
总结
在 Scanner 类中,如果我们在调用nextXXX() 方法中的任何一个之后调用 nextLine() 方法(注意:是 nextLine() 方法),则 nextLine() 不会从控制台读取值,并且光标不会进入控制台,它将跳过该步骤。nextXXX() 方法是 nextInt()、nextFloat()、nextByte()、nextShort()、nextDouble()、nextLong()、next()。
在 BufferReader 类中不存在此类问题。此问题仅发生在 Scanner 类中,因为 nextXXX() 方法忽略了换行符,并且 nextLine() 只读取到第一个换行符。如果我们在 nextXXX() 和 nextLine() 之间再调用一次 nextLine() 方法,则不会出现此问题,因为 nextLine() 会消耗换行符。
希望本篇文章对你选择使用Scanner类或者是BufferedReader类有所帮助。
本文部分参考资料来自此网站:GeeksforGeeks。