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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么学习软件需要身份证验证_什么是两层身份验证,为什么我需要它?

    什么学习软件需要身份证验证_什么是两层身份验证,为什么我需要它?什么学习软件需要身份证验证Moreandmorebanks,creditcardcompanies,andevensocialmedianetworksandgamingsitesarestartingtousetwo-factorauthentication.Ifyou’realittleunclearonwhatitisoronw…

    2022年5月10日
    55
  • NV12与YV12,YUV的主要格式「建议收藏」

    NV12与YV12,YUV的主要格式「建议收藏」YV12是常用的CODEC格式,它的格式如下:  NV12

    2022年9月25日
    4
  • c语言return两个数_c语言里return0有什么用

    c语言return两个数_c语言里return0有什么用c语言return能不能有2个以上返回值c语言return能不能有2个返回值比如说return(a,b)更新时间:2019-05-1806:19最满意答案不是,要想返回2个以上返回值,建议返回值用数组或者参数用指针模式,直接改写2011-05-04回答其他回答如果你想返回多值的话,建议使用数组或指针(数组其实也是指针)2011-05-04回答不能的,除非你定义一个结构typedefstru…

    2025年7月13日
    2
  • sql 修改语句「建议收藏」

    sql 修改语句「建议收藏」update(修改)select*fromTablenamewherefield1=‘*****’(确定修改的数据)begintran–rollback(开启一个事务,以便失误后回滚)updateTablenamesetfield2=‘*****’wherefiled1=’*****’commit(提交)…

    2022年6月29日
    41
  • FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)

    FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)FFMPEG中的swscale提供了视频原始数据(YUV420,YUV422,YUV444,RGB24…)之间的转换,分辨率变换等操作,使用起来十分方便,在这里记录一下它的用法。swscale主要用于在2个AVFrame之间进行转换。下面来看一个视频解码的简单例子,这个程序完成了对”北京移动开发者大会茶歇视频2.flv”(其实就是优酷上的一个普通视频)的解码工作,并将解码后的数据保存为原始数据文件(例如YUV420,YUV422,RGB24等等)。其中略去了很多的代码。注:完整代码在文章:100

    2022年7月16日
    40
  • 人人工势场法

    人人工势场法人工势场法是局部路径规划的一种比较常用的方法。这种方法假设机器人在一种虚拟力场下运动。一、简介如图所示,机器人在一个二维环境下运动,图中指出了机器人,障碍和目标之间的相对位置。 这个图比较清晰的说明了人工势场法的作用,物体的初始点在一个较高的“山头”上,要到达的目标点在“山脚”下,这就形成了一种势场,物体在这种势的引导下,避开障碍物,到达目标点。

    2022年6月15日
    25

发表回复

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

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