比较
BufferedReader 与 Scanner
BufferedReader 与 Scanner 都是 Java 用于从标准输入流(比如键盘输入)中读取数据的类,但它们之间有一些区别。
BufferedReader:
- BufferedReader 是基于字符的输入流,它可以逐行读取字符数据。通常搭配 InputStreamReader使用,将字节流转换为字符流。
- 它提供了一种高效的方式来读取字符,特别是在需要逐行读取大量字符数据时。
- BufferedReader 没有直接的方法来解析不同类型的数据(如整数、浮点数等),需要手动进行解析和转换。
Scanner:
- Scanner 是一个方便的类,可以用于解析基本类型和字符串。它可以从输入流中提取不同类型的数据,如整数、浮点数、字符串等。
- Scanner 不仅可以读取字符数据,还可以解析不同类型的数据,使得数据的处理更为方便。
- 相较于 BufferedReader,Scanner 的功能更加强大,但在处理大量数据时可能会有一定性能损耗。
PrintWriter 和 System.out
PrintWriter 和 System.out 都可以用于向控制台输出数据,不过使用 PrintWriter 需手动关闭。
print()
:传递一个字符、字符串或其他类型的数据。println()
:与print()类似,但会在写入数据后添加一个换行符。printf()
:使用格式化字符串写入数据。
PrintWriter 手动关闭:
flush()
:用于手动刷新输出流,确保数据被及时地写出。close()
:用于关闭输出流并释放相关资源。
Scanner
Scanner in = new Scanner(System.in);
next()
: 读取并返回下一个单词(以空格分隔)。
nextInt()
: 读取并返回下一个整数。
nextDouble()
: 读取并返回下一个双精度浮点数。
nextLine()
: 读取并返回一行输入。
hasNext()
: 检查是否还有输入数据。
hasNextInt()
: 检查下一个输入是否为整数。
hasNextDouble()
: 检查下一个输入是否为双精度浮点数。
import java.util.Scanner;
public class InAndOut {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("========= int ============");
System.out.printf("请输入一个int类型的数赋给 a: ");
int a = in.nextInt();
System.out.printf("请输入一个int类型的数赋给 b: ");
int b = in.nextInt();
int ab = a + b;
System.out.println("a + b = " + ab);
System.out.println("========= long ==========");
System.out.printf("请输入一个long类型的数赋给 c: ");
long c = in.nextLong();
System.out.printf("请输入一个long类型的数赋给 d: ");
long d = in.nextLong();
long cd = c + d;
System.out.println("c + d = " + cd);
System.out.println("========= double ==========");
System.out.printf("请输入一个double类型的数赋给 e: ");
double e = in.nextDouble();
System.out.printf("请输入一个double类型的数赋给 f: ");
double f = in.nextDouble();
double ef = e * f;
System.out.println("e * f = " + ef);
System.out.println("========= String ==========");
in.nextLine(); // 消耗上一个换行符, 一般不需要,在控制台展示需要
String s = in.nextLine(); //获取下一行的文本内容
System.out.println("s 的内容:" + s);
System.out.println("========= 多个数处理,以 int求和 示例 ==========");
int ans = 0;
while (in.hasNextInt()) { //下一个输入为 int就继续,在控制台输入其他内容可终止,自己调试可以这样做
ans += in.nextInt();
}
System.out.println("多个int类型的数求和:" + ans);
in.close();
}
}
输出结果:
BufferedReader
因为BufferedReader没有直接的方法来解析不同类型的数据,且是按行读取,在做输入输出的题目时会有一定的优势。我们可以按行读取字符串,再将字符串按" "(空格)分割成字符串数组,再将每个单独(不包含空格)的字符串转换我们所需的类型,如果你要处理的内容就是这一行字符串,那你就不需要分割,直接使用即可。
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
readLine()
: 读取一行文本并返回一个字符串,不包括行尾的换行符。如果已经到达流的末尾,则返回 null。
将字符串 s 转换为一些所需类型,前提是合法转换:
int x = Integer.parseInt(s);
long y = Long.parseLong(s);
double z = Double.parseDouble(s);
示例
假设第一行给你一个数字 m,表示接下来有 m 行,每一行都有 两个数字(int示例),让你求和。
打印m行,打印形式:a + b = ? (?为 a 与 b 的和,括号里的内容不打印)
import java.io.*;
public class ReaderAndWriter {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
int m = Integer.parseInt(in.readLine());
for (int i = 0; i < m; i++) {
String[] str = in.readLine().split(" ");
int x = Integer.parseInt(str[0]);
int y = Integer.parseInt(str[1]);
int ans = x + y;
out.println(x + " + " + y + " = " + ans);
}
out.flush();
out.close();
in.close();
}
}