JAVA算法刷题---DAY 0 JAVA的快速IO

AI编程·六月创作之星博客挑战赛 10w+人浏览 1.6k人参与

本系列可作为 JAVAEE初阶 学习系列的笔记,文中提到的一些练习的代码,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。

点赞关注不迷路!您的点赞、关注和收藏是对小编最大的支持和鼓励! 

系列文章目录

JAVA初阶---------已更完

JAVA数据结构---------已更完

数据库初阶----------已更完

JAVA EE初阶---------正在更新

JAVA算法刷题---DAY 0 JAVA的快速IO

JAVA算法刷题---DAY1 数字统计、两个数组的交集、点击消除

JAVA算法刷题---DAY2 牛牛的快递、最小花费爬楼梯、数组中两个字符串的最小距离


目录

目录

系列文章目录

目录

前言

一、为什么普通 IO 会超时?

二、快速 IO 完整模板代码

三、逐行代码深度解析

(一)快速输出模块:PrintWriter

(二)快速输入模块:Read 自定义类

1. 成员变量

2. 核心方法:next ()

3. 常用读取方法

(三)主类使用规范

四、快速 IO 使用示例

五、核心注意事项(必看!)

六、总结

总结

总结


前言

小编作为新晋码农一枚,会定期整理一些写的比较好的代码,作为自己的学习笔记,会试着做一下批注和补充,如转载或者参考他人文献会标明出处,非商用,如有侵权会删改!欢迎大家斧正和讨论!

在 Java 算法刷题过程中,输入输出效率低是导致代码超时的高频原因!Java 原生的Scanner输入、System.out.println输出在大数据量场景下速度极慢,而自定义快速 IO(Fast IO) 能大幅提升读写效率,完美解决超时问题。

本文就带大家逐行解析这套通用的 Java 快速 IO 模板,学会后直接复制套用,再也不用担心 IO 导致的超时!

一、为什么普通 IO 会超时?

先明确核心痛点:

  1. Scanner:功能强大但底层实现复杂,每次读取都要做大量校验,大数据量下速度极慢;
  2. 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)
    )
);
  1. 核心作用:替代System.out.println,实现缓冲输出
  2. 层级解析:
    • System.out:标准输出流(控制台);
    • OutputStreamWriter:字节流转字符流,适配控制台输出;
    • BufferedWriter字符缓冲流,先把数据存到内存缓冲区,不立即输出;
    • PrintWriter:提供print/println等易用方法,简化输出;
  3. 关键优势:数据先存在缓冲区,最后调用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四种类型,完全满足需求。

(三)主类使用规范

  1. 全局对象outin都声明为public static,整个代码中可以直接调用,无需创建对象;
  2. 异常处理main方法必须声明throws IOException,因为缓冲流会抛出 IO 异常;
  3. 必须收尾:代码最后一定要写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();
}

五、核心注意事项(必看!)

  1. 禁止混用:不要和ScannerSystem.out.println混用,会导致 IO 紊乱、输出错乱;
  2. 必须 closeout.close()必写代码,否则无输出;
  3. 异常声明:所有读取 / 输出操作都会抛出IOException,要么throws,要么try-catch(刷题直接throws最方便);
  4. 适用场景:数据量越大(比如 10 万级输入 / 输出),快速 IO 的速度优势越明显。

六、总结

Java 算法刷题超时,80% 的 IO 问题都能靠这个模板解决!

  • 输入:用Read类替代Scanner,速度提升 10 倍以上;
  • 输出:用PrintWriter替代System.out,大幅减少 IO 开销;
  • 使用方式:直接复制模板→写业务代码→最后 out.close (),零学习成本。

建议把这个模板保存到你的代码片段中,刷题时直接复用,彻底告别 IO 超时!

总结

  1. 超时根源ScannerSystem.out在大数据量下 IO 效率极低;
  2. 快速 IO 核心BufferedReader缓冲输入 + PrintWriter缓冲输出;
  3. 使用口诀:全局对象直接用,代码写完close流,禁止混用普通 IO;
  4. 刷题价值:通用、高效、零修改,解决 Java IO 超时的最优方案。


总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yvonne爱编码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值