Java快速输入输出使用详解
Java快速输入输出使用详解
一、背景:
Scanner类输入时,虽然方式很简单,但是输入实在太慢了,经常遇到大的数据量时候就超时。(你觉得数据有点多时就用快速输入即可)
某些题目用Scanner会超时。所以需要输入快一点的方法。所以写了这篇,不同方法的输入。
二、输入:
1.Scanner
最简单的方式,不过比较慢。
import java.util.Scanner;
public class ScannerInput {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String str1 = s.next(); // 输入一个字符串,空格或回车换行时就不继续读了
String line = s.nextLine(); // 输入一行字符串
int num = s.nextInt(); // 输入一个整数
double num2 = s.nextDouble(); // 输入一个小数
}
}
2.BufferedReader
我常用的,最简单方式。也叫缓冲流或包装流
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedReaderInput {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); // 输入
String line = in.readLine(); // 输入的一行字符
System.out.println(line);
}
}
3.StreamTokenizer
这种方式需要处理一个异常,try的话代码太多了,直接抛出就好。
主要用于分词。
注意:StreamTokenizer只能接收数字或字母,如果输入除空格和回车以外的字符
(如:~!@#$%^&*()_+{}:<>?)无法识别,会显示null。
同时,如果该输入字符串时却输入数字会显示null,该输入数字时输入字符串也会显示null
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class StreamTokenizerInput {
public static void main(String[] args) throws IOException {
// Input(); // 输入字符串和数字
// LoopInputString(); // 循环输入字符串
LoopInputDouble(); // 循环输入数字
}
/** 输入字符串和数字 */
public static void Input() throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
in.nextToken(); // 解析下一个标记。每次调用sval或nval时候都需要调用一下
String str = in.sval; // 输入字符串
System.out.println(str);
in.nextToken(); // 解析下一个标记。每次调用sval或nval时候都需要调用一下
double num = in.nval; // 输入数字
System.out.println(num);
}
/** 循环输入字符串 */
public static void LoopInputString() throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
while (in.nextToken() != StreamTokenizer.TT_EOL) { // 当下一个输入不是行末尾时
String str = in.sval; // 输入字符串
System.out.println(str);
}
}
/** 循环输入数字 */
public static void LoopInputDouble() throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
while (in.nextToken() != StreamTokenizer.TT_EOL) { // 当下一个输入不是行末尾时
double num = in.nval; // 输入数字
System.out.println(num);
}
}
}
4.StringTokenizer
参考《算法竞赛入门经典训练指南》中刘老师推荐的输入方法
主要用于分词。
/** 快速输入类 */
class Reader {
static BufferedReader reader;
static StringTokenizer tokenizer;
/** 调用这个方法来初始化reader,即InputStream*/
static void init(InputStream input) {
reader = new BufferedReader(new InputStreamReader(input));
tokenizer = new StringTokenizer("");
}
/** 获取下一段文本 */
static String next() throws IOException {
while ( ! tokenizer.hasMoreTokens() ) {
tokenizer = new StringTokenizer(reader.readLine());
}
return tokenizer.nextToken();
}
static int nextInt() throws IOException {
return Integer.parseInt( next() );
}
static double nextDouble() throws IOException {
return Double.parseDouble( next() );
}
}
当然,你也可以粘贴下面这个,这样你就不需要再调用 init() 方法了。
我比较
推荐
使用这个,粘贴到需要用的类的里面,作为内部类。
/** 快速输入类 */
static class Reader {
static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer tokenizer = new StringTokenizer("");
/** 获取下一段文本 */
static String next() throws IOException {
while ( ! tokenizer.hasMoreTokens() ) {
tokenizer = new StringTokenizer(reader.readLine());
}
return tokenizer.nextToken();
}
static int nextInt() throws IOException {
return Integer.parseInt( next() );
}
static double nextDouble() throws IOException {
return Double.parseDouble( next() );
}
}
三、 输出
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class PrintWriterOutput {
public static void main(String[] args) throws IOException {
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
String str = "这里是要输出的内容!";
out.print(str); // 输出后不换行
out.println(str); // 输出后换行
out.printf("%s", str); // 格数化输出
out.flush(); // 记得刷新一下在控制台输出
}
}
四、常用整合
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class InputOutput {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
String line = in.readLine(); // 输入一行字符
out.println(line); // 输出并换行
out.flush(); // 在控制台输出,不要忘记这句!
}
}
版权声明:本文为weixin_44034328原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。