Java中系统相关的类:System类、Runtime类

Java程序在不同操作系统上运行时,可能需要取得平台相关的属性,或者调用平台命令来完成特点功能。Java提供了System类和Runtime类来与程序的运行平台进行交互。

一、System类

System类代表当前Java程序的运行平台,程序不能创建System类的对象,System类提供了一些类变量和类方法,允许直接通过System类来调用这些类变量和类方法。

System类提供了代表标准输入、标准输出和错误输出的类变量,并提供一些静态方法用于访问环境变量、系统属性的方法,还提供了加载文件和动态链接库的方法

注意:
加载文件和动态链接库主要对native方法有用,对于一些特殊的功能(如访问操作系统底层硬件设备等)Java程序无法实现,必须通过C语言来完成。此时需要使用C语言为Java方法提供实现。

下面程序通过System类来访问操作系统的环境变量和系统属性。

import java.io.FileOutputStream;
import java.util.Map;
import java.util.Properties;

public class SystemTest {
    public static void main(String[] args) throws Exception {
        //获取系统所有的环境变量
        Map 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()等方法来访问程序所在平台的环境变量和系统属性。

提示:
System类提供了通知系统进行垃圾回收的gc()方法,以及通知系统进行资源清理的runFinalization()方法。

System类还有两个获取系统当前时间的方法:currentTimeMillis()和nanoTime(),它们都返回一个long型整数。实际上它们都返回当前时间与UTC1970年1月1日午夜的时间差,前者以毫秒做单位,后者以纳秒为单位,但是必须指出的是,这两个方法返回的时间粒度取决于底层操作系统,可能所在的操作系统根本不支持毫秒、纳秒作为计时单位。例如:许多操作系统以几十毫秒为单位测量时间,currentTimeMillis()方法不可能返回精确的毫秒数;而nanoTime()方法很少用,因为大部分操作系统都不支持使用纳秒作为计时单位。

除此之外,System类的in、out、err分别代表系统的标准输入(通常是键盘)、标准输出(通常是显示器)和错误输出流,并提供了setIn()、setOut()、setErr()方法来改变系统的标准输入、标准输出和标准错误输出流。

System类还提供了一个identityHashCode(Object x)方法,该方法返回指定对象的精确hashCode值,也就是根据该对象的地址计算得到hashCode值。当某个类的hashCode值方法被重写了后,该类实例的hashCode()方法就不能唯一标识对象;但通过identityHashCode()方法返回的hashCode值,依然是根据该对象的地址计算得到的hashCode值所以如果两个对象的IdentityHashCode相同,则这两个对象绝不对同一对象


public class IdentityHashCodeTest {
    public static void main(String[] args) {
        //下面程序中s1和s2是两个不同的对象
        String s1 = new String("Hello");
        String s2 = new String("Hello");
        //String重写了hashCode()方法——改为根据字符串序列计算hashCode值
        //因为s1和s2字符序列相同,所以它们的hashCode值相同
        System.out.println(s1.hashCode() + "-----" + s2.hashCode());
        //s1和s2是不同的字符串对象,所以它们的identityHashCode值不同
        System.out.println(System.identityHashCode(s1) +
                "-----" + System.identityHashCode(s2));
        String s3 = "Java";
        String s4 = "Java";
        //s3和s4是相同的字符串对象,所以它们的identityHashCode值不同
        System.out.println(System.identityHashCode(s3) +
                "----=" + System.identityHashCode(s4)) ;
    }
}

通过identityHashCode(Object x)方法可以获得对象的identityHashCode值,这个特殊的identityHashCode值可以唯一确定地标识该对象。
因为identityHashCode()值是根据地址计算得到的,所以任意两个对象的IdentityHashCode值总是不相等的

二、Runtime类

Runtime类代表Java程序的运行时环境,每个Java程序都有一个与之对应的Runtime实例应用程序通过该对象与其运行时环境相连应用程序不能创建自己的Runtime实例,但可以通过getRuntime()方法获取与之关联的Runtime对象。

与System类似的是,Runtime也提供了gc()和runFinalization方法通知系统进行垃圾回收清理系统资源,并提供了load(String fileName)和loadLibrary(String libname)方法加载从文件和动态链接库。

Runtime类代表系统运行时环境,也可以访问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类还有一个功能——直接单独启动一个进程来运行操作系统的命令。

public class ExecTest
{
    public static void main(String[] args)
    throws Exception
    {
        Runtime rt = Runtime.getRuntime();
        //记事本程序
        rt.extc("notepad.exe");
    }
}

上面程序中的粗体字代码将启动Windows系统里的“记事本”程序。

你可能感兴趣的:(Java基础)