JAVA的一般输入输出 和 快速输入输出 (BufferedReader&BufferedWrite)(转载)
1.JAVA的一般输入输出 和 快速输入输出 (BufferedReader&BufferedWrite)
摘要
本文主要介绍快速输入输出, 文中提到了几个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值,作用当执行到hasNext()时,它会先扫描缓冲区中是否有字符,有则返回true,继续扫描。直到扫描为空,这时并不返回false,而是将方法阻塞,等待你输入内容然后继续扫描
所以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 否则继续扫描缓冲区,或者等待输入。
如果想要通过hasnext()方法结束输入需要用到hasnext带参数的一个重载方法。
修改后的代码
用“#”号当结束条件
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int i=1;
while(!sc.hasNext("#")){
System.out.println("第"+i+"个字符串:"+sc.next());
i++;
}
System.out.println("输入完成");
}
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.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
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=st.nval;
out.println(n);
out.flush();//将输出缓冲区清空。
}
}
}
PrintWriter类中 包含 print() printf() writer() 方法 printf()可用于格式化输出 但速度是最慢的 write()的速度是最快的
注意要在最后刷新输出缓冲区, 就是记得加上 out.flush() 否则会什么也不输出
PrintStream和PrintWriter
PrintStream
是一种FilterOutputStream
,它在OutputStream
的接口上,额外提供了一些写入各种数据类型的方法:
- 写入
int
:print(int)
- 写入
boolean
:print(boolean)
- 写入
String
:print(String)
- 写入
Object
:print(Object)
,实际上相当于print(object.toString())
以及对应的一组println()
方法,它会自动加上换行符。
我们经常使用的System.out.println()
实际上就是使用PrintStream
打印各种数据。其中,System.out
是系统默认提供的PrintStream
,表示标准输出:
System.out.print(12345); // 输出12345
System.out.print(new Object()); // 输出类似java.lang.Object@3c7a835a
System.out.println("Hello"); // 输出Hello并换行
System.err
是系统默认提供的标准错误输出。
PrintStream
和OutputStream
相比,除了添加了一组print()
/println()
方法,可以打印各种数据类型,比较方便外,它还有一个额外的优点,就是不会抛出IOException
,这样我们在编写代码的时候,就不必捕获IOException
。
PrintWriter
PrintStream
最终输出的总是byte数据,而PrintWriter
则是扩展了Writer
接口,它的print()
/println()
方法最终输出的是char
数据。两者的使用方法几乎是一模一样的:
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()
int s = in.read() // 读入一个字符 ,其范围从 0 到 65535 (0x00-0xffff))读入的字符,如果已到达流末尾,则返回 -1,相当于返回他的ASCII码
String s1 = in.readLine(); // 读入一行 可读入空格可读入回车 但会将回车抛弃
string s2[] = in.readLine().Split(" "); // 使用Split通过空格分割读入的一行字符串,存在s2中,遇到回车结束
需要注意的是 在windows中按一下回车键 一共有两个字符 "\n\r" 而read()只能读取一个字符所以如要要用read来达到吸收回车的目的,需要用两个read(); 如果用readLine()的话会将"\n\r"全部吸收 , 所以只需要一个readLine()来吸收回车。
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)方法 将其变为字符串形式输出。
或者使用 + 拼接一个字符串,这样 参数整体就是一个字符串了,比如加一个换行符。详见代码:
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
注:转载于https://blog.csdn.net/GD_ONE/article/details/103480407
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律