大家好,又见面了,我是你们的朋友全栈君。
JAVA基础知识和常用算法合集:
https://blog.csdn.net/GD_ONE/article/details/104061907
目录
3.1使用StreamTokenizer 和 PrintWriter
3.2 使用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()方法。
如:
字符串需要用
或者
需要注意的是:
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() 输入。
结果如下:
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();
}
}
输出:
一共输入了:
1 (按回车键)
ABC DEF
然后下面输出了
49(1的ASCii码)
13(回车键的ACSii码)
10 (换行键的ASCII码)
ABC DEF
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141239.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...