JAVA的一般输入输出 和 快速输入输出 (BufferedReader&BufferedWrite)

JAVA的一般输入输出 和 快速输入输出 (BufferedReader&BufferedWrite)JAVA基础知识和常用算法合集:https://blog.csdn.net/GD_ONE/article/details/104061907目录1.主类的命名必须是Main2.输入输出:2.1输入:(1)使用Scanner类进行输入(2)hasNext()方法2.2输出3快速输入输出3.1使用StreamTokenizer和PrintW…

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

JAVA基础知识和常用算法合集:

https://blog.csdn.net/GD_ONE/article/details/104061907

目录

1. 主类的命名必须是Main

2.输入输出:

  2.1输入:

(1)使用Scanner类进行输入

(2) hasNext()方法  

2.2 输出

3 快速输入输出

 3.1使用StreamTokenizer 和 PrintWriter

 3.2 使用BufferedReader和BufferedWriter实现快速输入输出

BufferedReader

BufferedWriter

实例


摘要

本文主要介绍快速输入输出, 文中提到了几个IO类,这里推荐使用BufferedReader输入,BufferedWriter输出,当输入输出的数据量大于一百万左右就必须使用快速IO不能直接使用Scanner和System.out.print

1. 主类的命名必须是Main

形如:

public class Main{

}

2.输入输出:

  2.1输入:

(1)使用Scanner类进行输入

    首先需要定义一个可以在控制台从键盘接收数据的Scanner对象: (Scanner类的包名是 java.util.Scanner)

Scanner in = new Scanner(System.in); // 用于控制台从键盘读入数据

然后使用这个in对象配合in.nextXXX()方法接收数据:

不同类型的数据使用不同的in.nextXXX()方法。

如:

JAVA的一般输入输出 和 快速输入输出 (BufferedReader&BufferedWrite)

字符串需要用

JAVA的一般输入输出 和 快速输入输出 (BufferedReader&BufferedWrite)

         或者

      JAVA的一般输入输出 和 快速输入输出 (BufferedReader&BufferedWrite)

需要注意的是:                                                                                                                                                                        

in.next() 从缓冲区接收字符遇到空格后停止。 相当于 cin 和 scanf

in.nextLine() 从缓冲区接收字符,并且接收空格,遇到换行才停止,并且会自动舍弃换行。 相当于 gets()

import java.util.Scanner;

public class Main{
	public static void main(String[] args){
		Scanner in = new Scanner(System.in);
		String s1 = in.next();  // -》 C++中 cin/scanf
		String s2 = in.nextLine(); // -> C++中  gets()
		System.out.println("s1:"+s1);
		System.out.println("s2:"+s2);
		in.close();
	}
}

上述代码定义了两个字符串类:s1 和 s2。  分别用 in.next()  和 in.nextLine() 输入。

结果如下:

JAVA的一般输入输出 和 快速输入输出 (BufferedReader&BufferedWrite)

 in.next()将从缓冲区内接收了abc赋值给了s1 , 遇到空格后停止,缓冲区内还剩下了一个空格和qwe ,in.nextLine()将缓冲区剩下的字符赋值给 s2。

类比scanf和gets。

 

(2) hasNext()方法  

in.hasNext用法:

in.hasNext()的返回值是bool值,作用是当在缓冲区内扫描到字符时,会返回true, 否则会发生阻塞,等待数据输入。

所以in.hasNext()是不会返回false的

所以遇到多组输入时,可以使用 while + in.hasNext() 相当于 while(scanf())

如:每次输入三个整数,输出三数之和。

import java.util.Scanner;

public class Main1 {
	public static void main(String[] args){
		Scanner in = new Scanner(System.in);	
		int a, b, c; 
		while(in.hasNext()){	
		    a = in.nextInt();
		    b = in.nextInt();
		    c = in.nextInt();
		    System.out.printf("%d\n",a+b+c);
		}
	}
}

和in.nextXXX()方法类似,in.hasNextXXX()也有针对不同类型变量的方法。

如:

in.hasNext() // 判断缓存区中还有没有数据,有返回true, 否则等待输入。
in.hasNextInt() // 判断输入的是不是int型的数据,是的话返回true 否则继续扫描缓冲区,或者等待输入。
in.hasNextDouble() // 判断输入的是不是double型的数据,是的话返回true 否则继续扫描缓冲区,或者等待输入。

 

 


2.2 输出

        java中往控制台输出的几种常用函数

System.out.printf(); //和C/C++中的printf一样。 可使用格式控制符进行格式化输出。
// 例如: 输出一个int类型变量  System.out.printf("%d",a);
System.out.print() //不能使用格式控制符进行格式化输出,仅输出变量
System.out.println() //不能使用格式控制符进行格式化输出,仅输出变量,但会自动输出一个换行。

 

3 快速输入输出

   (不想看函数介绍的,可以直接看最下面的程序实例)

  3.1使用StreamTokenizer 和 PrintWriter实现快速输入输出 (非推荐)

StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

   这种方式只能读取数字和字母字符串, 不能读取空格和其他字符。

实例1:

import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        //快速输入  
        StreamTokenizer in =new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        //快速输出
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        while(in.nextToken() != StreamTokenizer.TT_EOF){
            int a = (int)in.nval; // 获取一个整型数据
            in.nextToken();  //从流中获取下一个数据, 相当于scanf()读入一个数据然后存在缓存区
            String s=in.sval; //  获取一个字符串  
            in.nextToken();
            double n=in.nval;
            out.println(n);
            out.flush();//将输出缓冲区清空。
        }  
    }
}

  PrintWriter类中 包含 print()  printf()  writer() 方法    printf()可用于格式化输出  但速度是最慢的  write()的速度是最快的

  注意要在最后刷新输出缓冲区, 就是记得加上  out.flush()  否则会什么也不输出

 3.2 使用BufferedReader和BufferedWriter实现快速输入输出(推荐)

BufferedReader 和 BufferedWriter 都在 java.io.*包内。

BufferedReader

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

成员方法
方法                                                   描述
int read()                                            读取单个字符。
int read(char[] cbuf, int off, int len)     将字符读入数组的某一部分。
String readLine()                                读取一个文本行。
long skip(long n)                                 跳过字符。
boolean ready()                                  判断此流是否已准备好被读取。
void close()                                         关闭该流并释放与之关联的所有资源。
void mark(int readAheadLimit)           标记流中的当前位置。
boolean markSupported()                   判断此流是否支持 mark() 操作(它一定支持)。
void reset()                                          将流重置到最新的标记。

主要使用read() 和 readLine()

String s = in.read() // 读入一个字符 可读入空格回车 但不抛弃回车
String s1 = in.readLine(); // 读入一行 可读入空格可读入回车 但会将回车抛弃
string s2[] = in.readLine().Split(" "); // 使用Split通过空格分割读入的一行字符串,存在s2中

需要注意的是 在windows中按一下回车键 一共有两个字符 “\n\r”  而read()只能读取一个字符所以如要要用read来达到吸收回车的目的,需要用两个read();  如果用readLine()的话会将”\n\r”全部吸收 , 所以只需要一个readLine()来吸收回车。

详见下面实例2.


 

BufferedWriter

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));

主要使用 BufferedWriter类中的 write() 类进行输出。 当数据量大的时候一定要使用这个类进行输出,谨记!

  需要注意的是 write() 不能直接输出int类型, 因为write(int a)  会输出其对应的ASCii码的字符 ,比如输出 65 会显示 A 详见代码:

int a = 65;
char b = '2';
String c = "3";

out.write(a);
out.write("\n");
out.write(b);
out.write("\n");
out.write(c);
out.write("\n");
out.flush();

输出:
A
2
3

 

所以当需要输出一个int类型的变量时, 可以用Integer.toString(int a)方法 将其变为字符串形式输出。

或者使用 + 拼接一个字符串,这样 参数整体就是一个字符串了,比如加一个换行符。详见代码:

int a = 65;

out.write(a + "\n");
out.write(Integer.toString(a));
out.flush();

输出:
65
65

 

实例2:

import java.io.*;
import java.util.*;


public class Main{
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
    public static void main(String[] args) throws IOException{
        //测试writr 不能直接输出int类型
    	int a = 65;
        out.write(a);
        out.write("\n");
    	out.write(a + "\n");  // 使用 + 号拼接个字符串 使参数整体为一个字符串 
        out.write(Integer.toString(a)); // 输出a的字符串形式
        out.write("\n");
       
        //测试 read() 和  readLine();
        int b = in.read();   // read()只读取一个字符
        int c = in.read();   // 吸收 \n
        int x = in.read();   // 吸收 \r
       // String e = in.readLine();
        String d = in.readLine();
        out.write("\n");
        out.write(b + "\n");
        out.write(c + "\n");
        out.write(x + "\n");
        out.write(d + "\n");
        //out.write(e);
        out.flush();
    }
}

 输出:

JAVA的一般输入输出 和 快速输入输出 (BufferedReader&BufferedWrite)

一共输入了:

1  (按回车键)

ABC  DEF 

然后下面输出了

49(1的ASCii码)

13(回车键的ACSii码)

10 (换行键的ASCII码) 

ABC  DEF

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2022年5月26日 下午12:00
下一篇 2022年5月26日 下午12:00


相关推荐

  • 相机标定基础

    相机标定基础一.什么是摄像机标定从二维图像中恢复物体的三维信息,必须要知道空间坐标系中的物体点同它在图像平面上像点之间的对应关系,而这个对应关系是由摄像机的成像几何模型所决定的,这些几何模型参数就是摄像机参数。在大多数情况下这些参数必须通过实验才能得到,这个过程被称为摄像机标定。摄像机标定就是确定摄像机内部几何和光学特性(内部参数)以及摄像机坐标系相对于世界坐标系的三维位置和方向(外部参数)的过程。

    2022年5月11日
    61
  • JVM 垃圾回收机制主要原理

    JVM 垃圾回收机制主要原理对于垃圾JVM的垃圾回收机制这里我们称为GC,众所周知,java语言不需要像c++那样需要自己申请内存,自己释放内存,这些都是JVM帮我们做好了的,但是对于一名java程序员,想要更近自己的水平更上一层楼,就要去了解GC的工作原理,根据原理才能写出更好的更优的程序,这里我们先初步讲解一下GC的工作原理首先我们在讲解之前我们需要了解一下JVM内存运行时数据区的三个重要的地方堆(heap)

    2022年4月30日
    39
  • DB破解(暗黑破坏神辅助)使用方法「建议收藏」

    DB破解(暗黑破坏神辅助)使用方法「建议收藏」下载网址:http://www.mochafuzhu.com/forum.php?mod=forumdisplay&fid=57开始请先在网站里下载运行环境并安装,然后下载辅助。(Q群:528411948)1、首先,一定要先 启动游戏,注意!辅助的路径千万不要有中文的目录,否则会造成辅助自动退出的问题。然后解压下载好辅助后,我们得到以下画面,以管理员身份运行打开。(如果不能打开请检…

    2022年5月5日
    70
  • python 主函数传参_Python函数传参详解

    python 主函数传参_Python函数传参详解Python 中使用 def 来定义函数 依次是 def 函数名 括号 括号中的参数及结尾的冒号 另起一行缩进写函数体 函数的返回值用 return 语句返回 如 deffunc 参数 函数体 return 调用函数时会对传入的参数进行自动检查 包括参数的类型及参数的数量 如果不符合要求会抛出 TypeError 异常 参数的类型可分为 1 必选参数 2 默认参数 3 可变参数 4 关键字参数函数中的参

    2026年3月26日
    2
  • vscode快捷键与使用配置[通俗易懂]

    vscode快捷键与使用配置[通俗易懂]简化记忆F1F11Ctrl+P?!:@#Ctrl+NCtrl+Shift+NCtrl+Shift+WCtrl+TabCtrl+\Ctrl+[、Ctrl+]Shift+Alt+F,或Ctrl+Shift+P后输入formatcodeAlt+Up或Alt+Down选中按TAB右移,按SHIFT+TAB左移Ctrl+F主命令框F1或Ctrl+Shift+P:打开命令面板。在打开的输入框内,可以输入任何命令,例如:按一下Backspace会

    2022年5月20日
    53
  • 超好听的英文名男孩_男生好听小众的英文名

    超好听的英文名男孩_男生好听小众的英文名TroyKentBrandonLandonCordBarneyBlaineVanVictorJulesDylanColeIggy/EgbertJackDoug/DouglasRyderTylerSethNemoDarrenFoleyBennettBrianPhil/PhilipEthanJusticeIvanElliottWilsonJoe/JosephZorbaLiamAdam

    2025年6月15日
    4

发表回复

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

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