在Java算法题中,处理输入输出主要依赖系统流(System.in
和System.out
),常用的方法总结如下:
一、输入方法(读取系统输入)
主要通过java.util.Scanner
类或BufferedReader
类实现,适用于不同场景:
1. Scanner类(简单场景,代码简洁)
最常用的输入工具,支持多种数据类型的直接读取,常用方法:
nextInt()
:读取整数(int
)nextLong()
:读取长整数(long
)nextDouble()
/nextFloat()
:读取浮点数next()
:读取字符串(以空格/回车为分隔符)nextLine()
:读取一整行字符串(包括空格)hasNextXxx()
:判断是否还有对应类型的输入(循环读取时常用)
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int a = sc.nextInt(); // 读整数String s = sc.next(); // 读字符串double d = sc.nextDouble(); // 读浮点数// 循环读取多个整数(直到没有输入)while (sc.hasNextInt()) {int num = sc.nextInt();// 处理逻辑}sc.close(); // 建议关闭资源}
}
2. BufferedReader类(高效场景,大输入量)
- 基于字符流的缓冲输入,速度快于
Scanner
,适合大规模输入(如十万级数据) - 需要配合
InputStreamReader
转换流使用,且读取后需手动转换数据类型
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 读取一行字符串(返回null表示输入结束)String line = br.readLine();// 读取整数(需手动转换)int num = Integer.parseInt(br.readLine());// 循环读取多行String s;while ((s = br.readLine()) != null) {// 处理每行数据}br.close(); // 关闭资源}
}
二、输出方法(写入系统输出)
主要通过System.out
相关方法实现,常用:
1. print() / println()(简单输出)
print(x)
:输出数据x
,不换行println(x)
:输出数据x
并换行(最常用)- 支持直接输出基本类型、字符串、对象(会自动调用
toString()
)
System.out.print("Hello"); // 输出不换行
System.out.println(123); // 输出整数并换行
System.out.println("World"); // 输出字符串并换行
2. printf()(格式化输出)
- 类似C语言的
printf
,支持格式控制符(如%d
整数、%s
字符串、%f
浮点数等) - 适合需要固定格式的输出(如保留小数位、对齐等)
int a = 10;
double b = 3.14159;
System.out.printf("整数:%d,浮点数:%.2f%n", a, b);
// 输出:整数:10,浮点数:3.14(%n表示换行,跨平台)
3. BufferedWriter类(高效输出,大输出量)
- 缓冲输出流,速度快于
System.out
,适合大规模输出 - 需手动调用
flush()
刷新缓冲区(或关闭流时自动刷新)
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;public class Main {public static void main(String[] args) throws IOException {BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));bw.write("Hello"); // 写入字符串bw.newLine(); // 换行(跨平台)bw.write(String.valueOf(123)); // 写入整数(需转为字符串)bw.flush(); // 刷新缓冲区(必须调用,否则可能不输出)bw.close(); // 关闭流(会自动刷新)}
}
三、选择建议
- 小规模输入输出:优先用
Scanner
+System.out.println()
,代码简洁易写。 - 大规模输入(如算法竞赛):用
BufferedReader
(读)+BufferedWriter
(写),效率更高。 - 格式化输出:用
System.out.printf()
,控制格式更方便。
这些方法基本能覆盖Java算法题中所有输入输出场景,掌握后可高效处理各类数据读写需求。