Java System类
System作为系统类,在JDK的Java.lang包中,可见它也是一种java的核心语言特性。System类的构造器由private修饰,不允许被实例化。因此,类中的方法也都是static修饰的静态方法。
Java不支持全局函数和变量,Java设计者将一些系统相关的重要方法和变量收集到了一个同意的类中,这就是Systemt类。System类不能被实例化,Syetem类中的所有成员都是静态的,当我们要引用这些变量和方法时,直接使用System类名作前缀。Systemt类主要提供的功能有:标准输入流、标准输出流、标准错误输出流;环境变量;加载文件和库;快速复制数组的一部分等。
定义
public final class System extends Object
System 类包含一些有用的类字段和方法。它不能被实例化。
在System类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于Java.lang包。由于该类的构造方法是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便的进行调用。
成员变量
System类内部包含in、out和err三个成员变量,分别代表标准输入流(键盘输入),标准输出流(显示器)和标准错误输出流(显示器)。
例如:System.out.println(“Test”);
该行代码的作用是将字符串”Test”输出到系统的标准输出设备上,也就是显示在屏幕上。同时可以使用System类中的成员方法改变标准输入流等对应的设备,例如可以将标准输出流输出的信息输出到文件内部,从而形成日志文件等。
方法
arraycopy——数组拷贝
- public static void main(String[] args) {
- int[] arr1 = { 0, 1, 2, 3, 4 };
- int[] arr2 = { 9, 9, 9, 9, 9 };
- System.arraycopy(arr1, 2, arr2, 0, 3);
- arr1[3] = 8;
- for (int i = 0; i < 5; i++)
- System.out.print(arr2[i] + " ");
- //2 3 4 9 9
- }
arraycopy方法五个参数,分别是被复制的数组,被复制的起始位置,复制到的数组,复制到这个数组的起始位置,复制到这个数组的结束位置。这个方法和Arrays中的copyOf、copyOfRange比较像,参数比较多,如果有需要也可使用。
currentTimeMillis——返回毫秒数
这个就不举例了,currentTimeMillis方法和Date类中getTime方法完全是一样的,如果只是需要毫秒数,这样的调用也是很方便的。但是需要注意的是currentTimeMillis并不是直接拿到了getTime的结果,currentTimeMillis是一个本地方法,返回的是操作系统的时间,由于有的操作系统时间的最小精确度是10毫秒所以这个方法可能会导致一些偏差。
getProperty——获取系统属性
我们通过调用这个方法,在参数中输入键的字符串获取系统的属性。
键 | 相关值的描述 |
---|---|
java.version | Java 运行时环境版本 |
java.vendor | Java运行时环境供应商 |
java.vendor.url | Java 供应商的 URL |
java.home | Java 安装目录 |
java.vm.specification.version | Java 虚拟机规范版本 |
java.vm.specification.vendor | Java 虚拟机规范供应商 |
java.vm.specification.name | Java 虚拟机规范名称 |
java.vm.version | Java 虚拟机实现版本 |
java.vm.vendor | Java 虚拟机实现供应商 |
java.vm.name | Java 虚拟机实现名称 |
java.specification.version | Java 运行时环境规范版本 |
java.specification.vendor | Java 运行时环境规范供应商 |
java.specification.name | Java 运行时环境规范名称 |
java.class.version | Java 类格式版本号 |
java.class.path | Java 类路径 |
java.library.path | 加载库时搜索的路径列表 |
java.io.tmpdir | 默认的临时文件路径 |
java.compiler | 要使用的 JIT 编译器的名称 |
java.ext.dirs | 一个或多个扩展目录的路径 |
os.name | 操作系统的名称 |
os.arch | 操作系统的架构 |
os.version | 操作系统的版本 |
file.separator | 文件分隔符(在 UNIX 系统中是“/”) |
path.separator | 路径分隔符(在 UNIX 系统中是“:”) |
line.separator | 行分隔符(在 UNIX 系统中是“/n”) |
user.name | 用户的账户名称 |
user.home | 用户的主目录 |
user.dir | 用户的当前工作目录 |
在我们操作文件的时候很可能需要使用到我们的当前工作目录,可以用这个方法来获得。
- public static void main(String[] args) {
- String dirPath = System.getProperty("user.dir");
- System.out.println(dirPath);
- //输出工作目录 D:\Workspaces\MyEclipse 10\Algorithms(这是我的目录,每个人都不同)
- }
上面的表中就不再举例了,比较常用的是后几个key。
gc——运行垃圾回收器
调用 gc 方法暗示着 Java 虚拟机做了一些努力来回收未用对象或失去了所有引用的对象,以便能够快速地重用这些对象当前占用的内存。当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间。
- public static void main(String[] args) {
- Date d = new Date();
- d = null;
- System.gc();
- // 在调用这句gc方法时,上面已经失去了d引用的new Date()被回收
- }
实际上我们并不一定需要调用gc()方法,让编译器自己去做好了。如果调用gc方法,会在对象被回收之前调用finalize()方法,但是我们也知道finalize()方法不一定会被调用。总之java在这回收方面做的远不如c和c++。我们可以规避有关回收方面的问题。当需要了解的时候最好专门的去看JVM回收机制的文章。
exit——退出虚拟机
exit(int)方法终止当前正在运行的 Java 虚拟机,参数解释为状态码。根据惯例,非 0 的状态码表示异常终止。 而且,该方法永远不会正常返回。 这是唯一一个能够退出程序并不执行finally的情况。
- public static void main(String[] args) {
- try {
- System.out.println("this is try");
- System.exit(0);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- System.out.println("this is finally");
- }
- }
这段程序最后只会输出 this is try 这一句话,而不会输出 this is finally 。退出虚拟机会直接杀死整个程序,已经不是从代码的层面来终止程序了,所以finally不会执行。
例子
- public static void main(String[] args)
- {
- //测试arraycopy方法,注意,目的空间必须提前分配
- int[] src = {1,2,3,4,5,6,7,8,9};
- System.out.println("System.arraycopy");
- int[] dst = new int[src.length];
- System.arraycopy(src, 0, dst, 0, src.length);
- System.out.println("src = "+Arrays.toString(src));
- System.out.println("dst = "+Arrays.toString(dst));
- //同样是拷贝,Arrays.copyOf方法就不需要手动开辟空间
- System.out.println("Arrays.copyOf");
- int[] dst1 = Arrays.copyOf(src, src.length);
- System.out.println("src = "+Arrays.toString(src));
- System.out.println("dst1 = "+Arrays.toString(dst1));
- //测试currentTimeMillis()
- System.out.println("currentTimeMillis "+System.currentTimeMillis());
- //测试nanoTime(),单独输出的结果没有仍和意义,此函数只能用来计算时间差
- System.out.println("nanoTime "+System.nanoTime());
- long dt=System.nanoTime();
- dt = dt - System.nanoTime();
- System.out.println("dt = "+dt);
- //测试getenv(),注意遍历Map的用法,不是很理解
- System.out.println("System.getenv");
- Map<String,String> env = System.getenv();
- Iterator it = env.entrySet().iterator();
- while(it.hasNext())
- {
- Map.Entry a = (Map.Entry)it.next();
- System.out.println("<"+a.getKey()+"> = <"+a.getValue()+">;");
- }
- //getProperties(),注意遍历Map的用法,不是很理解
- System.out.println("System.getProperties");
- Properties p = System.getProperties();
- p.list(System.out);
- System.out.println("Hello World!");
- }
版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。