7.2 系统相关 7.2.1 System类
7.2 系统相关
Java
程序在不同操作系统上运行时,可能需要取得平台相关的属性,或者调用平台命令来完成特定功能。Java
提供了System
类和Runtime
类来与程序的运行平台进行交互。
7.2.1 System类
System
类代表当前Java
程序的运行平台,程序不能创建System
类的对象, System
类提供了一些类变量
和类方法
,允许直接通过System
类来调用这些类变量和类方法。System
类提供了代表标准输入
、标准输出
和错误输出
的类变量
,并提供了一些静态方法
用于访问环境变量
、系统属性
的方法,还提供了加载文件
和动态链接库
的方法。
加载文件和动态链接库
加载文件和动态链接库主要对native
方法有用,对于一些特殊的功能(如访问操作系统底层硬件设备等)Java
程序无法实现,必须借助C语言
来完成,此时需要使用C语言
为Java
方法提供实现。
其实现步骤如下:
Java
程序中声明native
修饰的方法,类似于abstract
方法,只有方法签名,没有实现。编译该Java
程序,生成一个class
文件。- 用
javah
编译第1步生成的class
文件,将产生一个.h
文件 - 写一个
cpp
文件实现native
方法,这一步需要包含第2步产生的.h
文件(这个.h
文件中又包含了JDK
带的jni.h
文件) - 在
Java
中用System
类的loadLibrary()
方法或Runtime
类的loadLibrary()
方法加载第4步产生的动态链接库文件,Java
程序中就可以调用这个native
方法了。
访问环境变量和系统属性
下面程序通过System
类来访问操作的环境变量
和系统属性
。
- 通过调用
System
类的getenv()
方法可以访问程序所在平台的环境变量
- 通过
getProperties()
、getProperty()
方法可以访问程序所在平台的系统属性
.
实例
1 |
|
控制台部分输出:
1 | ...... |
生成的props.txt
文件部分内容:
1 | #System Properties |
垃圾回收相关方法
System
类
- 提供
gc()
方法用来通知系统进行垃圾回收, - 提供
runFinalization()
方法用来通知系统调用finalize()方法来进行资源清理
。
获取当前时间的方法
currentTimeMillis()
和nanoTime()
,它们都返回一个long
型整数
。实际上它们都返回当前时间与UTC1970年1月1日 0点整
的时间差,前者以毫秒作为单位,后者以纳秒作为单位。
必须指出的是,这两个方法返回的时间粒度取决于底层操作系统,可能所在的操作系统根本不支持以毫秒、纳秒作为计时单位。
例如,许多操作系统以几十毫秒为单位测量时间,这种情况下currentTimeMillis()
方法不可能返回精确的毫秒数:
而nanoTime()
方法很少用,因为大部分操作系统都不支持使用纳秒
作为计时单位。
标准输入输出相关的属性和方法
除此之外, System
类的in
、out
和err
分别代表系统的标准输入
、标准输出
和错误输出流
,其中,标准输入通常是键盘,标准输出通常是显示器
提供了setIn()
、 setOut()
和setErr()
方法来改变系统的标准输入、标准输出和标准错误输出流。
identityHashCode方法
System
类还提供了一个identityHashCode(Object x)
方法,该方法返回指定对象的精确hashCode
值,也就是根据该对象的地址
计算得到的hashCode
值。
不同对象的identityHashCode值一定不同
当某个类的hashCode()
方法被重写后,该类实例的hashCode()
方法就不能唯一地标识该对象;但通过identityHashCode()
方法返回的hashCode
值,依然是根据该对象的地址
计算得到的hashCode
值。不同的对象在内存中的地址不可能相同,所以,如果两个对象的identityHashCode
值相同,则两个对象绝对是同一个对象。
实例
1 | public class IdentityHashCodeTest { |
运行结果:
1 | 69609650----69609650 |