ACM-JAVA快速输入输出

本文最后更新于:December 8, 2021 pm

积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。

目录

0.获取程序运行时间

1
2
3
4
5
6
7
long start = System.currentTimeMillis();
for(int i=1;i<=1000000;i++){}
long end = System.currentTimeMillis();
System.out.println("time="+(end-start)+"ms");

//以纳秒为单位
long start = System.nanoTime();

一般使用:就是StreamTokenizer与PrintWriter,前者输入,后者输出。具体情况具体而定。

1.输出

之所以先说输出,是因为输出比较简单。(#^.^#)

1.1 常规输出

这里的常规输出,就是平常用的最多的 System.out.println(); 。这也没什么好说的了。

1.2 PrintWriter输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//所需包
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

// 输出分为两步:
// 1、先通过print()或println()方法把需要输出的内容放入缓冲区,
// 2、然后通过flush()将缓冲区的内容输出到控制台
public static void main(String[] args) {
/* 下面这是IO流包装,直接套用就好*/
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
out.println("Greater than");/*输出内容*/
out.println("Less than");
out.println("Equal");
out.flush();/*刷新输出缓冲区,把缓冲区的内容输出到控制台。可以自行尝试把这句代码写上和注释掉查看效果。*/
}

2.输入

2.1 传统输入

这里的常规输出,就是平常用的最多的 Scanner 。这也没什么好说的了。

2.2 StreamTokenizer输入

StreamTokenizer只能接收数字或字母,如果输入除空格和回车以外的字符(如:!@#$%^&*()[]{})无法识别,会显示null。

StreamTokenizer可以获取输入流并根据空格和回车分割成Token(标记),用nextToken方法读取下一个标记 。

如果标记是字符串,用st.sval获取标记,如果是数字用st.nval获取标记,st.navl是double类型。

2.2.1 输入数字(nval)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//所需包
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
//简写为
import java.io.*;


public static void main(String[] args) throws Exception {
/* 下面这是IO流包装,可以看不懂,直接套用就好*/
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
in.nextToken();/*nextToken()方法相当于让光标指向下一个位置*/
int n = (int) in.nval;//获取整数;
out.println(n);
out.flush();/*刷新输出缓冲区并输出*/
}

2.2.2 获取字符串(sval)

1
2
3
4
5
6
7
8
9
public static void main(String[] args) throws Exception {
/* 下面这是IO流包装,可以看不懂,直接套用就好*/
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
in.nextToken();/*nextToken()方法相当于让光标指向下一个位置*/
String str = in.sval;/*注意:sval是获取不带空格的字符串,含有空格的字符串无法全部读取,只会获取空格之前的。并且只能用来获取含字母和数字、中英文句号的字符串。具体情况需要自行尝试,至少写者在测试时是这样的。因为网上有些说的是只能是字母串,不能含数字或其他,否则会返回null。*/
out.println(str);
out.flush();/*刷新输出缓冲区并输出*/
}

2.2.3 处理到文件尾(多组输入)

判断是否到达文件结尾,如C语言的while(scanf(“%d”,&n)!=EOF)

1
while (in.nextToken() != StreamTokenizer.TT_EOF) //StreamTokenizer.TT_EOF这个是个参数,就是相当于EOF了。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) throws Exception {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

while (in.nextToken() != StreamTokenizer.TT_EOF){
int n = (int) in.nval;
in.nextToken();
int m = (int) in.nval;
out.println(n+" "+m);
out.flush();
}
}

2.3 BufferedReader输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//所需包
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public static void main(String[] args) throws Exception {
//高性能输入,用于数据量大,要求输入输出速度快
BufferedReader in =new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(System.out);

///读取一行内容,返回字符串
int i=Integer.parseInt(in.readLine()); //int型输入
out.println(i);
out.flush();

long l=Long.parseLong(in.readLine()); //long型输入
out.println(l);
out.flush();

float f=Float.parseFloat(in.readLine()); //float型输入
out.println(f);
out.flush();

double d=Double.parseDouble(in.readLine()); //double型输入
out.println(d);
out.flush();

String s=in.readLine(); //String型输入
out.println(s);
out.flush();

BigInteger b=new BigInteger(in.readLine()); //BigInteger型输入
out.println(b);
out.flush();
}

2.4 使用System.in.read();方法

System.in从标注输入获取数据,数据类型为InputStream。通过read();方法返回ASCII码,若返回值为-1,说明没有读取到任何字符结束工作。使用时需要添加抛出声明或用try/catch包围。

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) throws Exception {
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
int c;
try {
while((c = System.in.read()) != -1)
{
out.print((char)c);
out.flush();
}
} catch (IOException e) {
System.out.println(e.toString());
}
}

版本二

1.StreamTokenizer实现快速输入

需要的jar包

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

引入jar包其实可以更简单,只用一句

import java.io.*;

定义:

1
StreamTokenizer st =new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

StreamTokenizer只能接收数字或字母,如果输入除空格和回车以外的字符(如:!@#$%^&*()[]{})无法识别,会显示null。

StreamTokenizer可以获取****输入流并根据空格和回车分割成Token(标记),用nextToken方法读取下一个标记 。

如果标记是字符串,用st.sval获取标记,如果是数字用st.nval获取标记,st.navl是double类型。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

//import java.io.*;


public class Test {
public static void main(String[] args) throws IOException {
StreamTokenizer st =new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
st.nextToken();
String s=st.sval;
System.out.println(s);
st.nextToken();
double n=st.nval;
System.out.println(n);
/**输入内容
* hollow 1233
* 输出内容
* hollow
* 1233.0
*/

}

}

2.BufferedReader实现快速输入读一行

需要导入的jar

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

定义

1
BufferedReader inBuff=new BufferedReader(new InputStreamReader(System.in));

常用方法

1
inBuff.readLine()//读取一行内容,返回字符串

示例:

1
2
3
4
5
6
7
8
BufferedReader inBuff=new BufferedReader(new InputStreamReader(System.in));
String s=inBuff.readLine();
System.out.println("有问题吗"+s+"没有吧");
/**
* 输出内容
* hollow world!
* 有问题吗hollow world!没有吧
*/

3.PrintWriter实现快速输出

需要的jar包

import java.io.OutputStreamWriter;
import java.io.PrintWriter;

定义如下

1
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

常用方法:

1
2
3
4
5
6
7
// 输出分为两步:
// 1、先通过print()或println()方法把需要输出的内容放入缓冲区,
// 2、然后通过flush()将缓冲区的内容输出到控制台

print(需要输出的内容)//不换行输出,只是把需要的内容放入缓冲,
println(需要输出的内容)//换行输出
flush()//刷新缓冲区,把缓冲区的内容输出到控制台,

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package CCPC;

import java.io.OutputStreamWriter;
import java.io.PrintWriter;

//import java.io.*;


public class Test {
public static void main(String[] args) {
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
String s="hollow world";
int i=12344;
out.print(s+" "+i);
out.flush();
/**
* 输出内容
* hollow world 12344
*/

}

}