VectorLu

Java 与特定操作系统

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

System

代表当前 Java 程序的运行平台,程序不能创建 System 类的对象,可以直接通过 System 类来调用这些类变量和类方法。提供了代表标准输入、标准输出和错误输出的类变量,并提供了一些静态方法用于访问环境变量、系统属性的方法,还提供了加载文件和动态链接库的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// SystemTest.java
import java.util.*;
import java.io.*;
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"));
}
}

注意

TODO: Finish the dll compilation.

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

  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 方法。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class IdentityHashCodeTest {
public static void main(String[] args) {
// 下面程序中 s1s2 是两个不同对象
String s1 = new String("Test");
String s2 = new String("Test");
// String 重写了 hashCode() 方法——改为根据字符序列计算 hashCode 值
// 因为 s1s2 的字符序列相同,所以它们的 hashCode 方法返回值相同
System.out.println(s1.hashCode()
+ "----" + s2.hashCode());
// s1s2 是不同的字符串对象,所以它们的 identityHashCode 不同
System.out.println(System.identityHashCode(s1)
+ "----" + System.identityHashCode(s2));
String s3 = "Java";
String s4 = "Java";
// s3s4 是相同的字符串对象,所以它们的 identityHashCode 值相同
System.out.println(System.identityHashCode(s3)
+ "----" + System.identityHashCode(s4));
}
}

Runtime

Rumtime 类代表 Java 程序的运行时环境,每个 Java 程序都有一个与之对应的 Runtime 实例,可以访问 JVM 的相关信息,如处理器数量、内存信息等。应用程序不能创建自己的 Runtime 实例,但可以通过 getRuntime() 方法获取与之关联的 Runtime 对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 类还有一个功能——它可以直接单独启动一个进程来运行操作系统的命令。

您的支持将鼓励我继续创作!

热评文章