问题前景
学java的都知道输出语句是
System.out.println("你好");
但是获取输入的值为什么这么麻烦呢
我们通常使用的方式如下
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
如果你在给萌新讲课,那么你不仅要解释
public static void main(String[] args)
这句废话
还要解释
Scanner scan = new Scanner(System.in);
着实有点心累。
而且就算入门了,也只是吧经历放到了其他核心api或者一些其他的技术,根本没有想过去了解下java的输入原理(反正我是这样)
然后我在教同学java的时候,我甚至直接从jshell开始,因为不想解释上面两句废话
先把基础语法学会,然后开始解释public是什么 static 是什么
言归正传,这里来看下系统的输入输出
控制台输出
要想知道为什么是System.out.println("你好");
就要先知道System.out
是个什么东西
我们通过源码追踪找到
他这里是一个PrintStream类型一个静态变量,然后我们继续追踪,发现同样也是Output类型的。
使用PrintWriter
我们都学过java的io操作,我们可以尝试使用PrintWriter试一下
发现结果都一样,唯一的不同就是我们使用完毕系统输出后
需要为了节省资源来关闭流
而我们使用System.out.println("你好");
的时候并不需要关闭流
最后总结出:
系统的System.out.println();
能帮我们更好的管理流,关闭流和释放资源都是系统来帮我们完成的
控制台输入
那么问题就来了,那为什么系统不把好事做到底,顺便把System.in也这样做
我们可以尝试一下,看看能直接读取到什么
使用字节流读取字节
下面我们写一个最原始的获取控制台输入的案例
使用BufferReader
然后我们可以使用BufferReader来给他升升级
结果还是写了一大老堆代码
而且,他读取的内容也十分有限制
了解Scanner
Scanner是什么,他真的只是一个从控制台输入的吗
他的构造方法有很多,但归根结底一句话,就是处理流中的字符串
Scanner里面有非常多的能帮助我们转换数据
所以,推荐使用Scanner的目的就是使用方便,我们能够按照我们的需求获取流中的数据(不仅仅是控制台)
我们可以使用Scanner来读取一个txt文件
如果我们知道下一行是一个数字还是字符串还是其他类型,我们就可以使用Scanner来读取
不过这个一般不会使用,这里只是举例说明
我们用的更多的是xml、json等比较成熟的文件,所以用不到Scanner
而最适合的当然就是我们用户手动输入的,所以,我们知道接下来系统要读取的数据,我们就按照需求在控制台输入,从而达到目的。
总结
Scanner:用来处理流中的文字,来获取我们想要的值
System.out:系统来帮我们管理、关闭和释放资源