Java 系统相关 —— System类和RunTime类

Java 系统相关

Java程序在不同操作系统上运行时,可能需要取得平台相关的属性,或者调用平台命令来完成特定功能。

Java提供了System类和Runtime类来与程序的运行平台进行交互

System类

System类代表当前Java程序的运行平台,程序不能创建System类的对象,只能通过调用System类的类变量和类方法来获取信息和执行功能;

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

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

  1. Java程序中声明native修饰的方法,类似于abstract方法,只有方法签名,没有实现。编译该Java程序,生成一个.class文件
  2. 用 javah 编译第1步生成的.class文件,生成一个.h文件
  3. 写一个.cpp文件实现native方法,这一步需要包含第2步产生的.h文件(这个.h文件中又包含了JDK带的 jni.h 文件)
  4. 将第3步的.cpp文件编译成动态链接库文件
  5. 在Java中用System类的 loadLibrary..() 方法或Runtime类的 loadLibrary() 方法加载第4步产生的动态链接库文件,Java程序中就可以调用这个native方法了

获取系统所有的环境变量:

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.text文件中,并生成到当前路径下
props.store(new FileOutputStream("props.text"),"System Properties");
//输出特定的系统属性
System.out.println(System.getProperty("os.name"));

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

System.gc();
System.runFinalization();

System类还提供了通知系统进行垃圾回收的方法:currentTimeMillis()和nanoTime()
它们都返回当前时间与 UTC 1970-1-1 00:00:00 的时间差,前者以毫秒为单位,后者以纳秒为单位
这两个方法返回的时间粒度取决于底层操作系统,
许多操作系统以十几毫秒为单位测量时间,currentTimeMillis()方法不可能返回精确的毫秒数
nanoTime()方法就更少用了,因为大部分操作系统都不支持使用纳秒作为计时单位

System.out.println(System.currentTimeMillis());
System.out.println(System.nanoTime());

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

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

Runtime类

Rumtime类代表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 runtime = Runtime.getRuntime();
        System.out.println("处理器数量:"+runtime.availableProcessors());
        System.out.println("空闲内存数:"+runtime.freeMemory());
        System.out.println("总内存数:"+runtime.totalMemory());
        System.out.println("可用最大内存数:"+runtime.maxMemory());
    }
}

除此之外,Runtime还有一个功能——可以直接单独启动一个进程来运行操作系统的命令:

public class RunTimeTest {
    public static void main(String[] args) throws IOException {
        Runtime runtime = Runtime.getRuntime();
        //打开记事本
        runtime.exec("notepad.exe");
    }
}

猜你喜欢

转载自www.cnblogs.com/woshi123/p/12482785.html
今日推荐