System类
System类代表当前Java程序的运行平台,程序不能创建System类的对象,System类提供了一些类变量和类方法,允许直接通过System类来调用这些类变量和类方法。
System类提供了代表标准输入、标准输出和错误输出的类变量,并提供了一些静态方法用于访问环境变量、系统属性的方法,还提供了加载动态文件和动态链接库的方法。下面程序通过System类来访问操作的环境变量和系统属性。
注意:加载文件和动态链接库主要对native方法有用,对于一些特殊的功能(如访问操作系统底层硬件设备等)Java程序无法实现,必须借助C语言来完成,此时需要使用C语言为Java方法提供实现。其实现步骤如下:
- Java程序中声明native修饰的方法,类似于abstract方法,只有方法签名,没有实现。编译该Java程序,生成一个class文件。
- 用javah便宜第一步生成的class文件,将产生一个.h文件。
- 写一个.cpp文件实现native方法,这一步需要包含第2步产生的.h文件(这个.h文件中又包含了JDK带的jni.h文件)。
- 将第3步的.cpp文件编译成动态链接库文件。
- 在Java中用System类的loadLibrary..()方法或Runtime类的loadLibrary()方法加载第4步产生的动态链接库文件,Java程序中就可以调用这个native方法了。
public class SystemTest { public static void main(String[]args)throws Exception { //获取系统所有的环境变量 Map<String,String> env=System.getenv(); for(String name:env.keySet()) { System.out.println(name+"--->"+env.get(name)); } //获取指定环境变量的值 System.out.println(System.getenv("JAVA_HOME")); //获取所有的系统属性 Properties props=System.getProperties(); //将所有的系统属性保存到props.txt文件中 props.store(new FileOutputStream("props.txt"),"System Properties"); //输出特定的系统属性 System.out.println(System.getProperty("os.name"); } }
上面程序通过调用System类的getenv()、getProperties()、getProperty()等方法来访问程序所在平台的环境变量和系统属性。该程序运行结束后还会在当前路径下生成一个props.xtxt文件,该文件中记录了当前平台的所有系统属性。
System类提供了通知系统进行垃圾回收的gc()方法,以及通知系统进行资源清理的runFinalization()方法。
System类还有两个获取系统当前时间的方法:currentTimeMillis()和nanoTime(),它们都返回一个long型整数。实际上它们都返回当前时间与UTC1970年1月1日午夜的时间差,前者以毫秒作为单位,后者以纳秒作为单位。必须指出的是:这两个方法返回的时间粒度取决于底层操作系统,可能所在的操作系统根本不支持毫秒、纳秒作为计时单位。
除此之外,System类的in、out和err分别代表系统的标准输入(通常是键盘)、标准输出(通常是显示器)和错误输出流,并提供了setIn()、setOut()和setErr()方法来改变系统的标准输入、标准输出和错误输出流。
System类还提供了一个identityHashCode(Object x)方法,该方法返回指定对象的精确hashcode值,也就是根据该对象的地址计算得到的hashcode值。当某个类的hashCode()方法被重写后,该类实例的hashCode()方法就不嫩有唯一的标识该对象。但通过identityHashCode()方法返回的hashCode值,依然是根据该对象地址计算得到的hashCode值。所以,如果两个对象的identityHashCode值相同,则两个对象绝对是同一个对象。
Runtime类
Runtime类代表Java程序的运行时环境,每个Java程序都有一个与之对应的Runtime实例,应用程序不能创建自己的Runtime实例,但可以通过getRuntime()方法获取与之关联的Runtime对象。
与System类似的是,Runtime也提供了gc()和runFinalization()方法来通知系统进行垃圾回收、清理系统资源,并提供了load(String filename)和loadLibrary(String libname)方法来加载文件和动态链接库。
Runtime代表Java程序的运行时环境,可以访问jvm的相关信息,如处理器数量、内存信息等。
public class RuntimeTest { public static void main(String[]args) { //获取Java程序关联的运行时对象 Runtime rt=Runtime.getRuntime(); System.out.println("处理器数量:"+rt.availableProcessors()); System.out.println("空闲内存数:"+rt.freeMemory()); System.out.println("总内存数:"+rt.totalMemory()); System.out.println("可用最大内存数:"+rt.maxMemory()); } }
上面程序中粗体代码就是Runtime类提供的访问JVM相关信息的方法。除此之外,Runtime类还有一个功能——它可以直接单独启动一个进程来运行操作系统的命令,如下所示:Runtime提供了一系列exec()方法来运行操作系统命令,详见: Runtime APIpublic class ExecTest { public static void main(String[]args)throws Exception { Runtime rt=Runtime.getRuntime(); //运行记事本程序 rt.exec("notepad.exe"); } }