c++输入一个字符就输出不需要回车_java.lang.system,如果你只用它输出日志,就真有点out了,因为它还能这样用!...

入题

还记不记得咱们刚学Java那会,写的第一个程序是什么?我想多数人写的第一个程序就是下图中的代码:

46de48082aaf644049310070fcebb7a3.png

多么经典的Hello World,学习每种新语言的第一常规操作!于是乎,在以后的Java开发生涯中,少不了出现System.out.println,而99%的情况下,咱们也只是拿它来输出一下日志,方便调试和定位bug的原因而已!

但仅此而已吗?

java.lang.System能干什么?

咱们先看一下这个类的定义:

93440d29f1e7d827d5af0b98acf1b24e.png

首先System是一个final类,不允许被继承(一般设置不能被继承的类都是自信的表现,因为设计者已觉得这个类足够出色,提供的功能足够精简而实用)。

其次这个类不能实例化,这从侧面说明了它内部提供的属性或方法应该都是静态的。

最后在功能上,它提供了标准的输入输出流和错误输出流,提供了访问外部属性和环境变量和方法,提供了加载文件和库的一种途径,提供了数组复制的一个实用方法。

但注释中的功能描述只是其核心功能而不是其全部功能,下面咱们一个一个的看,充分挖掘出这个类的实用价值!

提示:什么是“标准输入输出流”?
因为Java是从C++演化过来的,所以在Java中仍然保留着C或C++中的一些概念,而标准输入输出流正是这种由C语言中沿用下来的概念。
简单来讲,“流”代表着一块包含着字符的内存缓冲区,因该缓冲区内的字符是可以更新的,给人一种字符从该缓冲区流过的感觉,所以称之为“流”。

常用功能一:System.out

System.out的定义如下图所示,它其实是一个PrintStream,指向了标准的输出流,通常将缓冲的字符输出到控制台上,也就是上面咱们输出"Hello World“的用法!

1ae09712873494027757008875aac2a3.png

关于System.out的稍高级点的用法是可以通过调用System.setOut方法自定义数据的流向,比如:

081b39843a6bd2293639dc2e8aa79259.png

上面的代码中,第一次的System.out.println会将内容输出到控制台,第二次的System.out.println会将内容输出到通过setOut方法指定的文件中。

常用功能二:System.err

System.err跟System.out基本相同,二者都是PrintStream,默认将内容输出到控制台,只不过控制台在渲染二者输出的内容时,在显示方式比如颜色上可能会有差别。在使用方式上,跟out完全一致:

bc5fe4e6053c75ed09861fac5aa04992.png

常用功能三:http://System.in

默认情况下,程序运行到http://System.in语句时会停止运行,然后等待用户从控制台输入字符,不管用户输入的是什么字符,都会被标准输入流读取并存储到用户指定的位置,例如:

fbda625014b1701646f51621185aae26.png

在上面的例子中,标准输入流最终会截取用户输入的前五个字符,如果用户输入的前五个字符中包括“换行”符,同样也会被收录其中。当http://System.in遇到“回车”符时,会停止收录。上面代码运行的结果如下:

1、输入七个字符并回车

a536a0be3ebfe365a9395fe723728d5f.png

2、输入三个字符并回车

9a90866d36c317a95ea2f8593d20371c.png

看出上面两种结果的区别来了吗?对!第二种情况下,"Read Info is:333"后跟了一个换行,因为换行符也被标准输入流截取并存储到字节数组name中了!也正是因为这种原因,这种使用方式给人的感觉是有点太低端了,下面有一种更接近于“预期”的使用方式:

a2ab311d97212903c7dd945982b6d8a9.png

在上面的使用方式中,只要用户不输入回车,http://System.in就默认这一行输入还没有结果,等用户输入回车之后,它会将回车之前的所有字符收录并返回,所以上面例子的输出结果看起来顺眼多了:

ae7ca18006186fb4fd9be3afd93d042b.png
!!有一点需要特别注意,即http://System.in一旦被关闭,那么在程序的全生命周期内便无法再次使用!!

例如:

9a9e843d5e8f9476969fafdd5fef7377.png

30行之前的代码,我使用了try-with-resource(不清楚try-with-resource的可以通过链接去看相应的文章),如此一来,System.in便被close掉了,那么从31行代码开始,想再次使用System.in输入内容,便会抛出异常,提示标准输入流已被关闭了!

d0ae4e41725a4fd27c2933cb3291850e.png

所以这点一定要注意!

另外,标准输入也可以通过调用setIn()方法切换输入源,这里就不再赘述了~

常用功能四:访问控制台

可以通过System类的console()方法[jdk1.6+]获取当前的控制台,这里需要注意,由于操作系统的原因或Java程序启动方式的原因,console()方法返回的控制台类Console可能为空,所以在使用时要事先进行空值检测!

55e1a49b3567078df2bf9fe5ce09de1c.png

上面的一段演示代码即为Console类的使用方式,它明显有着C语言的影子!前两行负责格式化输出一些内容,第三行负责从控制台接收用户的输入,上面一段代码的执行结果如下:

5ba3600a925f1d397c9acbffbdb2bc68.png

常用功能五:数组拷贝

System类提供的数组拷贝方法又有着C语言的影子,来一起看一下:

f9da7cd382bbbde7dc094fe290681b10.png
提示:System.arraycopy方法底层实现的拷贝机制是“浅拷贝”,意思是针对primitive类型的元素,执行的是“值”的拷贝,针对object元素,执行的是“引用”的拷贝。

关于primitive和object类型的区别,可以看这里primitive&object

这个数组拷贝的方法会抛出三种常见的异常,分别是空指针异常,数组越界异常,元素类型匹配异常。

常用功能六:获取日期和时间

在System类中提供了两个关于时间的方法:

  • currentTimeMillis()

该方法返回的是自1970年1月1号上午12点整与当前调用该方法这一时刻的毫秒间隔数。

037429345f8a6b70869dd64ed5dcafdf.png
  • nanoTime()

该方法返回的是自JVM启动时与当前调用该方法这一时刻的毫秒间隔数。所以平时想监测某段代码的执行时间时,建议使用nanoTime而不是使用currentTimeMillis。

常用功能七:手工退出程序

程序员有时候想在某个控制分支上让当前的程序停止运行,那么调用System.exit()方法即可。该方法接收一个整型参数,通常情况下,传递0表示程序正常终止,传递非0值表示程序异常终止。

bd11e8375a3d42d7cc21fe84a03f7408.png

其它功能

除了上述七点常用功能之外,System类还提供了一些其它的功能,比如运行时读写某些属性的值、读取环境变量的信息,建议JVM执行垃圾回收等。由于这些功能在平时的代码中不常用到,这里就不多说了,有兴趣的朋友可以直接翻开System的源代码,里面都有这些方法。

总结

写到现在,System类给我最大的感受就是:它身上有很多C语言的影子,它提供的功能都是偏向于系统层面的,也难怪这个类的名字就是“System"!

ddc7038cc2662eb18fe05e0be59037d9.png

正因为该类提供的功能都偏向于系统层面,所以如果只拿它来输出一些调试日志的话,真就有点屈才了!建议掌握它的常用功能,在编程中需要控制一些系统层面的信息时,由它来完成很合适!

---------关于作者----------

Java开发人员,在今日头条开有视频专栏《Java高级加油站》,头条号名称跟知乎名称相同,想看视频专栏的朋友可以去搜索关关注!

-------------------------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值