前言
Java的输入是比较麻烦的,而且存在一些"bug"
因为Java本来就不是用来开发控制台程序的,主要是后台开发
因为有时候是在前台传数据传到后台
所以其实很少读入数据
读入一个字符
System.int.read()
可以读入一个字符,但是需要搭配异常处理
并且需要导入包
import java.io.IOException;//在最开头导入IOException包
// 这里需要抛出一个异常
public static void main(String[] args) throws IOException {
System.out.print("Enter a char:");
char i=(char)System.in.read();
System.out.print("Your char is:"+i);
}
构造Scanner对象,与标准输入流 System.in 关联
我们经常利用Scanner对象来读入数据
不过Scanner的使用 也需要导入包
在最开头导入包:import java.util.Scanner
代码:
Scanner scanner = new Scanner(System.in);// 这样就构造了一个Scanner对象
//并且与System.in相关联
理解:
构造的对象的名字叫 scanner
scanner
就像一个流,里面存放了你输入键盘的内容
流中还有东西 就不会让你输入,会把流中的东西读走
注意:scanner其实是一种资源,使用完毕 最好关闭:scanner.close()
就像C中的文件关闭fclose()
读入整数
已经构建好Scanner对象:scanner
scanner.nextInt
–>读入一个整数
nextInt就是把流中的内容转化为int 如果不能转 那么就报错
public static void main2(String[] args) {
Scanner scanner = new Scanner(System.in);
int x=scanner.nextInt(); // 读入整数 用x接受
System.out.println(x); //输出整数
//使用完毕之后 关闭scanner
scanner.close();
}
其他的读入类似
重点看一下读入字符串
读入字符串
读入字符串有两种方式:
scanner.next()
scanner.nextLine()
区别:
- nextLine()表示读入一行,包括空格
- next()遇到空格就会结束 空格后面的留在缓冲区会被 下一次的读取给读走
当然做OJ的时候不用考虑这个问题,人家后台会给你处理好
使用next()的常见“坑”
- 如果我们使用
scanner.next()
读入“hello world”,由于next()
遇到空格结束,因此此时缓冲区还存在你输入的 “world” 未被读走,如果我们接下来使用scanner.nextInt()
读取整数,并不会先让你输入,因为此时缓冲区还有内容"world",所以他会把"world" 进行nextInt
的转换, 而字符串肯定是不能转为int的
所以就会报错!
所以我们一般使用的是 scanner.nextLine()
关于读整数和读字符串的先后顺序
如果我们 需要读取整数和字符串
一般先读字符串再读整数
为什么呢?
这也是Java输入的一个bug
先看例子:
- 先读字符串,再读整数
分析:
因为nextLine()会读走换行符
其他的并不会
所以如果先读走整型,只是把可以转换成整型的数据都走了 剩下的呢?
–> 此时缓冲区还有\n没有读走,这时候 nextLine就会读走换行符 输出就啥也没有,之后向下走一行
而 如果先读字符串就不存在这个问题
所以原则:如果是读整数和字符串,那么就先读字符串
循环读取
hasNextInt()
---->存在下一个整数
类似的还有hasNextchar()
等
while(scanner.hasNextInt()){
int n=scanner.nextInt();
System.out.println(n);
}
上面代码的意思就是 如果流中还有能转换成int类型的数据 那么进入循环
再IDEA中 按Ctrl + D 为停止
再OJ 中 这些不用管,题目要求输入n个整数 后台会帮我们处理的
hasNext()
的坑
看这样一个代码
如果流中还有东西 就进入循环
但是:这种方法 只会判断流中是否还存在东西
有东西就进入循环
但是如果进入循环 数据无法被nextInt()转换 成int类型
就会报错
(不负责任的家伙)
如何避免?
还是使用hasNextInt()
直接在控制循环的条件位置 顺便检查了是否还有能够转化为想要的数据类型的内容
这里利用hasNextInt
–>看下一个是否为整数,如果不是整数就不进入循环,不会报错