本系列可作为 JAVAEE初阶 学习系列的笔记,文中提到的一些练习的代码,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。
点赞关注不迷路!您的点赞、关注和收藏是对小编最大的支持和鼓励!
系列文章目录
JAVA算法刷题---DAY1 数字统计、两个数组的交集、点击消除
JAVA算法刷题---DAY2 牛牛的快递、最小花费爬楼梯、数组中两个字符串的最小距离
目录
目录
前言
小编作为新晋码农一枚,会定期整理一些写的比较好的代码,作为自己的学习笔记,会试着做一下批注和补充,如转载或者参考他人文献会标明出处,非商用,如有侵权会删改!欢迎大家斧正和讨论!
在 Java 算法刷题过程中,输入输出效率低是导致代码超时的高频原因!Java 原生的Scanner输入、System.out.println输出在大数据量场景下速度极慢,而自定义快速 IO(Fast IO) 能大幅提升读写效率,完美解决超时问题。
本文就带大家逐行解析这套通用的 Java 快速 IO 模板,学会后直接复制套用,再也不用担心 IO 导致的超时!
一、为什么普通 IO 会超时?
先明确核心痛点:
Scanner:功能强大但底层实现复杂,每次读取都要做大量校验,大数据量下速度极慢;System.out.println:每调用一次就刷新一次缓冲区,频繁输出会产生大量 IO 开销,严重拖慢速度。
而快速 IO的核心思路:
- 输入:使用
BufferedReader(字节缓冲流)一次性读取大量数据,减少 IO 次数; - 输出:使用
PrintWriter+BufferedWriter缓冲输出,最后统一刷新,避免频繁 IO。
二、快速 IO 完整模板代码
这是算法刷题通用无侵入模板,直接复制到代码中即可使用,无需修改逻辑:
import java.util.*;
import java.io.*;
public class Main
{
// 快速输出对象:全局可用,缓冲输出
public static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
// 快速输入对象:全局可用,封装缓冲读取
public static Read in = new Read();
public static void main(String[] args) throws IOException
{
// ———— 此处写你的算法代码 ————
// 示例:读取整数
int n = in.nextInt();
// 示例:输出内容
out.println(n);
// 必须执行!刷新缓冲区,输出所有内容
out.close();
}
}
// 自定义快速读取类:封装所有常用读取方法
class Read
{
// 分割字符串:按空格/换行分割读取的一行数据
StringTokenizer st = new StringTokenizer("");
// 缓冲字符流:高效读取控制台输入
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
// 读取下一个字符串(按空格分割)
String next() throws IOException
{
// 如果当前行没有可读取数据,读取新一行
while(!st.hasMoreTokens())
{
st = new StringTokenizer(bf.readLine());
}
return st.nextToken();
}
// 读取一整行字符串
String nextLine() throws IOException
{
return bf.readLine();
}
// 读取int类型整数
int nextInt() throws IOException
{
return Integer.parseInt(next());
}
// 读取long类型长整数
long nextLong() throws IOException
{
return Long.parseLong(next());
}
// 读取double类型浮点数
double nextDouble() throws IOException
{
return Double.parseDouble(next());
}
}
三、逐行代码深度解析
我们把代码拆分为快速输出、快速输入、使用规范三部分讲解,通俗易懂。
(一)快速输出模块:PrintWriter
public static PrintWriter out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(System.out)
)
);
- 核心作用:替代
System.out.println,实现缓冲输出; - 层级解析:
System.out:标准输出流(控制台);OutputStreamWriter:字节流转字符流,适配控制台输出;BufferedWriter:字符缓冲流,先把数据存到内存缓冲区,不立即输出;PrintWriter:提供print/println等易用方法,简化输出;
- 关键优势:数据先存在缓冲区,最后调用
out.close()一次性输出,避免频繁 IO。
(二)快速输入模块:Read 自定义类
这是模板的核心,替代慢速度的Scanner,我们逐方法解析:
1. 成员变量
StringTokenizer st = new StringTokenizer("");
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedReader bf:高效缓冲输入流,一次性读取一行数据,速度远快于Scanner;StringTokenizer st:字符串分割工具,默认按空格、换行、制表符分割一行字符串,方便逐个读取数据。
2. 核心方法:next ()
String next() throws IOException
{
// 当当前行没有可读取的token时,读取新的一行
while(!st.hasMoreTokens())
{
st = new StringTokenizer(bf.readLine());
}
// 返回下一个分割后的字符串
return st.nextToken();
}
- 逻辑:先检查当前行是否有未读取的数据,没有就读取新一行,再分割;
- 作用:读取下一个以空格分隔的字符串,是所有数值读取方法的基础。
3. 常用读取方法
// 读取整行
String nextLine() throws IOException { return bf.readLine(); }
// 读取int
int nextInt() throws IOException { return Integer.parseInt(next()); }
// 读取long
long nextLong() throws IOException { return Long.parseLong(next()); }
// 读取double
double nextDouble() throws IOException { return Double.parseDouble(next()); }
- 所有数值类型都是基于
next()读取字符串后,转换为对应类型; - 支持刷题最常用的
int/long/double/String四种类型,完全满足需求。
(三)主类使用规范
- 全局对象:
out和in都声明为public static,整个代码中可以直接调用,无需创建对象; - 异常处理:
main方法必须声明throws IOException,因为缓冲流会抛出 IO 异常; - 必须收尾:代码最后一定要写
out.close()!- 作用:关闭输出流,刷新缓冲区,把缓冲区的数据全部输出到控制台;
- 不写的后果:所有输出内容会留在缓冲区,控制台无任何输出!
四、快速 IO 使用示例
替换普通 IO,直接套用即可:
public static void main(String[] args) throws IOException
{
// 读取整数
int a = in.nextInt();
int b = in.nextInt();
// 计算
int sum = a + b;
// 输出结果
out.println("求和结果:" + sum);
out.printf("a=%d, b=%d%n", a, b);
// 必须关闭!
out.close();
}
五、核心注意事项(必看!)
- 禁止混用:不要和
Scanner、System.out.println混用,会导致 IO 紊乱、输出错乱; - 必须 close:
out.close()是必写代码,否则无输出; - 异常声明:所有读取 / 输出操作都会抛出
IOException,要么throws,要么try-catch(刷题直接throws最方便); - 适用场景:数据量越大(比如 10 万级输入 / 输出),快速 IO 的速度优势越明显。
六、总结
Java 算法刷题超时,80% 的 IO 问题都能靠这个模板解决!
- 输入:用
Read类替代Scanner,速度提升 10 倍以上; - 输出:用
PrintWriter替代System.out,大幅减少 IO 开销; - 使用方式:直接复制模板→写业务代码→最后 out.close (),零学习成本。
建议把这个模板保存到你的代码片段中,刷题时直接复用,彻底告别 IO 超时!
总结
- 超时根源:
Scanner和System.out在大数据量下 IO 效率极低; - 快速 IO 核心:
BufferedReader缓冲输入 +PrintWriter缓冲输出; - 使用口诀:全局对象直接用,代码写完
close流,禁止混用普通 IO; - 刷题价值:通用、高效、零修改,解决 Java IO 超时的最优方案。


总结
以上就是今天要讲的内容,本文简单记录了算法刷题内容,仅作为一份简单的笔记使用,大家根据注释理解,您的点赞关注收藏就是对小编最大的鼓励!
168

被折叠的 条评论
为什么被折叠?



