论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
物联网
›
物联网
›
Java中,Scanner和System.out超时的办理方法及原理 ...
Java中,Scanner和System.out超时的办理方法及原理
嚴華
金牌会员
|
昨天 14:20
|
显示全部楼层
|
阅读模式
楼主
主题
910
|
帖子
910
|
积分
2730
ACM 模式的原理
在输入输出的时候,会先将输入输出的东西放在一个
文件
里,这个文件也叫做 IO 装备
为什么 Scanner 会慢
new 一个 Scanner ,在 Scanner 里面调用 next 的时候,程序会直接访问 IO 装备。在调用一个 next 的时候,只会在 IO 装备中拿出一个数,再将这个数返回程序
调用一个 next 就会访问一次 IO 装备,程序访问 IO 装备的速度特殊慢。以是当输入的数据量很大的时候,就会多次访问这个 IO 装备,以是就会超时
为什么 System. out 会慢
和 Scanner 读取数据一样。当输出数据的时候,也是将数据一个一个拿到 IO 装备中。由于程序访问 IO 装备的速度特殊慢,以是只要数据量轻微多一些,就会超时
快速读
自界说快读模板
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 nextInt() throws IOException{
return Integer.parseInt(next());
}
long nextLong() throws IOException{
return Long.parseLong(next());
}
double nextDouble() throws IOException{
return Double.parseDouble(next());
}
}
复制代码
模板解释
Java 在处理 IO 的时候,有两套标准:
字节流(System.in)
字符流(带 Reader 大概 Writer)
以是:
new InputStreamReader(System.in)
复制代码
这里就是将字节流转换成了字符流
BufferedReader
它是一个带
内存缓冲区
的字符流。将要读取数据的时候,先将 IO 装备里面的数据
一次性
放到这个"
内存缓冲区中
"。然后 BufferedReader 再调用 next() 的时候,就是直接在内存缓冲区里面拿数据的
这对比 Scanner 调用 next 之后,一次一次地重复在 IO 装备中读取数据来说,BufferedReader 在调用 next 的时候,只需要读取一次内存缓冲区,就能读取到全部数据。
直接从内存中拿数据,肯定是比访问 IO 装备要快得多的
StringTokenizer
这里是字符串裁剪。本质是拿到缓冲区中的数据,然后裁剪成一个一个的字符串,最后再转换成你想要的 int、long、double 等类型…
我们在这个类中,new 了一个 BufferedReader,然后搞了一个字符串裁接
st = new StringTokenizer(bf.readLine());
复制代码
我们这个字符串裁接传入的是 bf.readLine()
意思是:我们直接在内存缓冲区中拿一行数据,然后交给字符串裁接对象
return st.nextToken();
复制代码
这个对象向调用 next 返回的时候是 nextToken
意思是:我把拿出的一行字符串,裁接出来一个字符串,然后交给你
最后再将这个字符串转换成你需要的数据类型即可
为什么需要 while 循环
这里不需要 while 循环也行
String next() throws IOException{ st = new StringTokenizer(bf.readLine());
return st.nextToken();
}
复制代码
直接读取一行数据,然后直接返回裁出来的字符串就行
但是这里为什么要加上 while 呢?
因为有一些输入输出的题目,输入的数据不止只有一行
当把第一行的数据一个一个裁完之后,你是要读取下一行数据的
以是需要一个 while 循环判定,当背面没有数据了,就重新再读入一行,然后再返回新读入的一行的字符串
BufferedReader 相较于 System.in 快,就是因为他带了一个缓冲区。先把文件里面的数据革新到缓冲区里面,然后在缓冲区里面拿一行一行的数据。随后通过 StringTokenizer 将读取的一行一行数据(bf.readLine())一个个地进行裁剪工作。当背面还有的行时候,就一个一个的裁;当背面没有行的时候,就再重新读一行,一个一个地裁
快速写
public class Main{
public static PrintWiter out = new PrinterWriter(new BufferedWriter(new OutputStreamWriter(System.in))
);
public static Read in = new Read();
public static void main(String[] args) throws IOException{
int t = in.nextInt;
double d = in.nextDouble;
//...
out.close;
}
}
复制代码
这里的方法名和 Scanner 一样,正常直接调用即可
模板解释
new BufferedWriter(new OutputStreamWriter(System.in))
复制代码
这里是把字符流转换为字节流
此处的 BufferedReader 是在输出的时候,不直接将数据从 IO 装备输出到程序,而是先将数据输出到内存缓冲区中,然后程序在内存缓冲区中直接读取数据(与输入原理一致)
PrintWriter
其实 BufferedWriter 已经满足我们的需求了,为什么还要套一层 PrintWriter 呢?
因为 BufferWriter 的输出方式不好写,而 PrintWriter 的输出方式和 System.out 是完全一样的(使用方式完全一样)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
嚴華
金牌会员
这个人很懒什么都没写!
楼主热帖
【万能皆可链接】C++中的动态链接库编 ...
iOS全埋点解决方案-用户标识 ...
用uniapp实现微信小程序的电子签名效果 ...
MySQL实战45讲 20
Qt-FFmpeg开发-打开本地摄像头(6) ...
【云服务器】推荐阿贝云服务器,目前永 ...
【Selenium+Pytest+allure报告生成自动 ...
【Javaweb】Web工作原理、两种网页、两 ...
Spring Boot 配置文件
微服务介绍
标签云
挺好的
服务器
快速回复
返回顶部
返回列表