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 |
原文链接: 7.2 系统相关 7.2.1 System类