ACM模式下Java输入输出函数为什么会超时?及解决方法

在线OJ的两种模式

1.ACM模式:全空白,需要自己写框架,写输入和输出

2.核心代码模式:只需完成所给函数

在ACM模式下,如果输入输出的数据量级过大,运行时就会超时,即使代码正确也提交不了

那么为什么会超时?

因为Scanner/System.out进行输入输出时,都会频繁的和硬盘/控制台这类IO设备交互

Scanner的工作方式:每次都直接访问设备。

1.每调用一次Scanner.next(),都会直接向控制台/文件发起一次IO请求,读取一个数据。因为Scanner每次读取数据都和系统交互,效率极低,在数据量级大时输入会非常慢,拖慢运行速度

2.System.in属于字节流。按字节读取,不适合直接读中文、字符串

3.没有缓冲区:每次读都直接访问IO设备,速度慢

4.不能直接按行/按单词读取:必须自己处理字节------>字符的转换

System.out.println()的工作方式:每次输出都直接写设备

每调用一次System.out.println()都会把一行数据直接写到控制台/文件里。每次调用都要与系统进行交互,频繁调用会造成效率极低

解决方法:使用缓冲区。在输入时使用BufferedReader一次性批量将大量数据读入内存缓存;输出时使用PrintWriter/BufferedWriter先把数据累计到内存缓存,最终一次性输出到设备,大幅减少设备交互次数,提升运行速度

为什么这样就能提升运行速度?

输入:BufferedReader+缓冲区

1.用InputStreamReader将字节流------>字符流

2.再用BufferedReader包装,提供缓冲区

3.读取一整行数据

输出:PrinterWriter/BufferedWriter+缓冲区

1.用OutoutStreamWriter把System.out这个字节流转换为字符流

2.再用BufferedWriter给字符流提供缓冲区(解决频繁交互问题)

3.再包装PrintWriter,给缓冲流加上便捷的打印方法(BufferedWriter只能写字符串,不能直接打印数字,不能直接换行,必须写为:

,而PrintWriter提供了print()/println()/printf(),可以直接打印数字,字符串等各种类型

代码说明

相关推荐
图码4 分钟前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
傻瓜搬砖人9 分钟前
Spring集成Web环境
java·spring·maven
U盘失踪了10 分钟前
python curl转python脚本
开发语言·chrome·python
charlie11451419110 分钟前
Linux 字符设备驱动:cdev、设备号与设备模型
linux·开发语言·驱动开发·c
handler0112 分钟前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
FQNmxDG4S13 分钟前
Java泛型编程:类型擦除与泛型方法的应用场景
java·开发语言·python
我星期八休息34 分钟前
IT疑难杂症诊疗室:AI时代工程师Superpowers进化论
linux·开发语言·数据结构·人工智能·python·散列表
热心网友俣先生44 分钟前
2026年第二十三届五一数学建模竞赛C题超详细解题思路+各问题可用模型推荐+部分模型结果展示
c语言·开发语言·数学建模
01漫游者1 小时前
JavaScript函数与对象增强知识
开发语言·javascript·ecmascript
GottdesKrieges1 小时前
OceanBase恢复常见问题
java·数据库·oceanbase