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

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

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Oracle11g软硬件基本要求,Oracle 11g的安装

    Oracle11g软硬件基本要求,Oracle 11g的安装Oracle11g有基本安装和高级安装两种方式。两种方式对硬件要求也不相同,oracle11g软件非常大,对硬件要求很高。目前只是讲述在windows环境下的安装,Linux环境下安装以后会讲,下表给出了安装Oracle11g所需的硬件配置。系统要求说明CPU最低主频550MHZ以上内存1GB以上虚拟内存物理内存的2倍磁盘空间基本安装需4.55G,高级安装需4.92G一、Windows环境下安装…

    2022年7月25日
    29
  • webservice发送短信本地部署可以但是服务器部署发送短信息中文乱码

    webservice发送短信本地部署可以但是服务器部署发送短信息中文乱码

    2020年11月9日
    323
  • codemirror自定义代码提示_96图文编辑器

    codemirror自定义代码提示_96图文编辑器前提写这个的目的是因为之前项目里用到过CodeMirror,觉得作为一款在线代码编辑器还是不错,也看到过有些网站用到过在线代码编辑,当然我不知道他们是用什么做的,这里我把公司项目里用到的那部分抽出来,单独写篇博客,并把抽出来的那部分代码提交到GitHub去简单介绍CodeMirror是一款在线的支持语法高亮的代码编辑器。官网:http://codemirror.net/可…

    2022年8月14日
    5
  • Ubuntu修改密码和用户名

    Ubuntu修改密码和用户名​Ubuntu是一个Linux操作系统,修改密码和用户名是有危险的动作,请谨慎修改。一、Ubuntu修改密码和用户名Ubuntu更改密码步骤:1、进入Ubuntu,打开一个终端,输入sudosu转为root用户。注意,必须先转为root用户!!!2、sudopasswduser(user是对应的用户名)3、输入新密码,确认密码。4、修改密码成功,重启,输入新密码进入Ubun…

    2022年9月29日
    2
  • 三星ODIN刷机包的修改

    三星ODIN刷机包的修改SunnyOK系列讲座索引【第一讲】如何用Odin刷机-新手必读http://bbs.gfan.com/android-1653492-1-1.html【第二讲】I897卡刷或CWM刷机教程http://bbs.gfan.com/android-1701867-1-1.html【第三讲】APK应用程序的解包、修改、编辑、打包及应用http://bbs

    2022年7月21日
    19
  • day04 JavaScript高级程序设计 阅读总结

    day04 JavaScript高级程序设计 阅读总结《JavaScript高级程序设计》(第四版)阅读总结额,据说这本是前端er必看书籍,花了20个小时简单把这本书过了一下,目前暂时很少用到的东西我这一遍就没有过了,等以后要用的时候再回来继续学了。先来谈谈这本书的缺点,书籍前面章节用到了一些后面才讲到的东西,比如第三章讲symbol对象时,就用到了后面才讲的iterator和generator。然后就是感觉讲的有点太广了,而且基本没有课后习题,看过就是看过了,顶多自己花时间把书里面的例子都敲一遍。所以我建议应该和现代JavaScript教程一起食用。反

    2022年8月20日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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