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对象来读入数据
不过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()
区别:
使用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
–>看下一个是否为整数,如果不是整数就不进入循环,不会报错