网站分几类,梦璇帮我wordpress,wordpress 建站系统,网站建设电话销售开场白ACM 模式的原理
在输入输出的时候#xff0c;会先将输入输出的东西放在一个文件里#xff0c;这个文件也叫做 IO 设备
为什么 Scanner 会慢 new 一个 Scanner #xff0c;在 Scanner 里面调用 next 的时候#xff0c;程序会直接访问 IO 设备。在调用一个 next 的时候会先将输入输出的东西放在一个文件里这个文件也叫做 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 是完全一样的使用方式完全一样