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的接口上,额外提供了一些写入各种数据类型的方法:

  • 写入intprint(int)
  • 写入booleanprint(boolean)
  • 写入Stringprint(String)
  • 写入Objectprint(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是系统默认提供的标准错误输出。

PrintStreamOutputStream相比,除了添加了一组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

JAVA的一般输入输出 和 快速输入输出 (BufferedReader&BufferedWrite)(转载)的更多相关文章

  1. Java基础教程——使用Eclipse快速编写Java输入输出代码

    Eclipse安装 IDE:Integrated Development Environment,集成开发环境.好比是全自动洗衣机. 此处使用[eclipse-jee-4.6-neon-3-win32 ...

  2. C++快速输入输出优化

    在这里存一下我的快速输入输出优化 以及写题模板 这里的是$getchar$优化和$putchar$优化,$fread$和$fwrite$暂时咕咕咕 快速输入 这里$define$了一个$I\_int$ ...

  3. Java基础-SSM之Spring快速入门篇

    Java基础-SSM之Spring快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java ...

  4. Java基础-SSM之mybatis快速入门篇

    Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...

  5. 百度架构师带你进阶高级JAVA架构,让你快速从代码开发者成长为系统架构者

    百度架构师带你进阶高级JAVA架构,让你快速从代码开发者成长为系统架构者 1.

  6. 作为Java新手,如何才能快速的看透一个Java项目?

    前言 技术学习是一个总结.纠错.触类旁通的过程,而不是单纯重复练习的过程,如果你问一个做过5年以上Java的老码农,他们很多人都会有很强的"搬砖感",这种"搬砖感&quo ...

  7. 简明易懂,将细节隐藏,面向新手树立web开发概念——学完Java基础语法,超快速上手springboot+mybatiJavaWeb开发

    简明易懂,将细节隐藏,面向新手树立web开发概念 --学完Java基础语法,超快速上手JavaWeb开发 Web本质(先忽视各种协议) Web应用可以理解为浏览器和服务器之间的交互. 我们可以看一个简 ...

  8. Java并发编程:并发容器之CopyOnWriteArrayList(转载)

    Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...

  9. Java并发编程:并发容器之ConcurrentHashMap(转载)

    Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...

随机推荐

  1. [心得体会]RabbitMQ

    RabbitMQ是什么? 消息队列, 基于AMQP(高级消息队列), 使用Erlang语言编写, 收发消息使用 有什么用? 有什么应用场景? 1. 任务异步处理 2. 应用程序解耦 为什么使用Rabb ...

  2. 使用xcode实现IM的那些坑

    想用xcode基于XMPP实现即时通讯,mac必须安装openfire(xmpp服务器),mysql(本地数据库,用于配置openfire),JDK(打开openfire必须本地具备java环境),x ...

  3. take for granted

    解释含义1 Take for granted是一句地道的英语口语,意思是to expect someone to always be there and do things for you even ...

  4. wumei-smart智能家居开原项目

    一.项目简介 物美智能(wumei-smart)]是一套开源的软硬件系统,可用于二次开发和学习,快速搭建自己的智能家居系统. 硬件工程师可以把自己的设备集成到系统:软件工程师可以使用项目中的设备熟悉软 ...

  5. MySQL 那些常见的错误设计规范

    依托于互联网的发达,我们可以随时随地利用一些等车或坐地铁的碎片时间学习以及了解资讯.同时发达的互联网也方便人们能够快速分享自己的知识,与相同爱好和需求的朋友们一起共同讨论. 但是过于方便的分享也让知识 ...

  6. Pycharm上python运行和unittest运行两种执行方式解析

    前言 经常有人在群里反馈,明明代码一样的啊,为什么别人的能出报告,我的出不了报告,为什么别人运行结果跟我的不一样啊... 这种问题先检查代码,确定是一样的,那就是运行姿势不对了,一旦导入unittes ...

  7. 「CF527E」 Data Center Drama

    「CF527E」 Data Center Drama 传送门 显然一个环肯定满足题目条件. 然后我就开始想:先整一棵 \(\texttt{DFS}\) 树,然后非树边从深度深的节点向深度浅的节点连边, ...

  8. Springboot中Rest风格请求映射如何开启并使用

    问题引入 因为前端页面只能请求两种方式:GET请求和POST请求,所以就需要后台对其进行处理 解决办法:通过springmvc中提供的HiddenHttpMethodFilter过滤器来实现 而由于我 ...

  9. c语言:getch() getchar()

    1.getchar();从键盘读取一个字符并输出,该函数的返回值是输入第一个字符的ASCII码:若用户输入的是一连串字符,函数直到用户输入回车时结束,输入的字符连同回车一起存入键盘缓冲区.若程序中有后 ...

  10. C语言:随机数

    在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌.在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随机 ...