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

Java快速输入输出使用详解(解决Java输入输出超时问题)Java快速输入输出使用详解一、背景:  Scanner类输入时,输入效率比较慢,输入数据大于10^5左右时(你觉得数据有点多时就用快速输入即可),某些题目会超时。所以需要输入快一点的方法。  一般情况下输入数据多导致题目超时时,直接使用快速输入中的:1.简单方法即可。二、快速输入:1.简单方法(我常用的:只是加了个包装流BufferedReader)importjava.io.Bu…

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



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(); // 在控制台输出,不要忘记这句!
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • vscode配置java环境变量_vscode java环境

    vscode配置java环境变量_vscode java环境VScode配置Java环境小白成功配置完Java环境后的自我记录VScode下载在vscode官网:https://code.visualstudio.com/选择相应版本下载安装JDK下载vscode仅支持JDK11及以上版本JDK11下载:https://www.oracle.com/java/technologies/javase-jdk11-downloads.html可选择其他更高版本配置环境变量找到JDK安装的文件路径,复制文件路径在桌面上找到此电脑右键属性点

  • docker端口映射不起作用的解决办法有哪些_docker 端口映射

    docker端口映射不起作用的解决办法有哪些_docker 端口映射今天初学Docker和宿主机的端口映射,根据网上的博客进行了操作。执行命令:dockerrun-d-p50070:50070-p8088:8088–namehadoop1ubuntu:java但是发现命令可以正常执行,但端口映射就是不成功,PORTS一直为空,就像下图这样:然后输入命令dockerportc526发现输出也为空这就奇了怪了…

    2022年10月17日
  • web面试题及答案_前端html面试题

    web面试题及答案_前端html面试题阅读目录html/cssjavascriptes6vuereactjQuerywebpack、gulp、gruntnodehttpweb安全前端性能浏览器算法相关设计模式正则表达式职业规划参考资料html/css行内元素和块级元素举几个例子?行内元素:span,a,var,em,input,img,img,textarea,var,em,s……

  • java 重写和重载的区别[通俗易懂]

    java 重写和重载的区别[通俗易懂]classAnimal{ privateStringname; privateStringsex; privateintage; publicAnimal(){ //TODOAuto-generatedconstructorstub } publicvoidmove() { System.out.println("animalmove…

  • 分析ip地址,子网掩码,网关,dns之间的区别和联系(ip地址 子网掩码 网关的关系)

    转自:[https://www.cnblogs.com/JuneWang/p/3917697.html]IP地址,子网掩码、默认网关,DNS服务器是什么意思?(一)问题解析问:IP地址,子网掩码,默认网关,DNS服务器,有什么区别呀?我知道没有IP地址就不能上网,我也知道没设DNS就不能上外网,可它们都有什么功能,有什么区别呢?还有真奇怪,我的计算机没设DNS,竟然能上QQ,却不能…

  • 恐怖的vs2005 sp1安装过程.[通俗易懂]

    恐怖的vs2005 sp1安装过程.[通俗易懂]今天刚把这个400多M的sp1从公司拷回来,算计着这样可以省掉不少下载时间.可是,可是,竟然没有想到,安装过程是如此的恐怖.首先,我的C盘空间明显的感到害羞,只有1.5G的剩余空间了,赶

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号