首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java快速输入输出使用详解(解决Java输入输出超时问题)

Java快速输入输出使用详解(解决Java输入输出超时问题)

作者头像
全栈程序员站长
发布2022-08-24 20:10:51
发布2022-08-24 20:10:51
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

一、背景:

  Scanner类输入时,虽然方式很简单,但是输入实在太慢了,经常遇到大的数据量时候就超时。(你觉得数据有点多时就用快速输入即可)

  某些题目用Scanner会超时。所以需要输入快一点的方法。所以写了这篇,不同方法的输入。

二、输入:

1.Scanner

最简单的方式,不过比较慢。

代码语言:javascript
代码运行次数:0
运行
复制
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

我常用的,最简单方式。也叫缓冲流或包装流

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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

参考《算法竞赛入门经典训练指南》中刘老师推荐的输入方法

主要用于分词。

代码语言:javascript
代码运行次数:0
运行
复制
/** 快速输入类 */
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() 方法了。

我比较 推荐 使用这个,粘贴到需要用的类的里面,作为内部类。

代码语言:javascript
代码运行次数:0
运行
复制
    /** 快速输入类 */
    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() );
        }
    }

三、 输出

代码语言:javascript
代码运行次数:0
运行
复制
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(); // 记得刷新一下在控制台输出
	}
}

四、常用整合

代码语言:javascript
代码运行次数:0
运行
复制
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(); // 在控制台输出,不要忘记这句!
	}
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/141405.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月9,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景:
  • 二、输入:
    • 1.Scanner
    • 2.BufferedReader
    • 3.StreamTokenizer
    • 4.StringTokenizer
  • 三、 输出
  • 四、常用整合
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档