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——数组拷贝

  1. public static void main(String[] args) {  
  2.   
  3.       int[] arr1 = { 01234 };  
  4.       int[] arr2 = { 99999 };  
  5.   
  6.       System.arraycopy(arr1, 2, arr2, 03);  
  7.   
  8.       arr1[3] = 8;  
  9.   
  10.       for (int i = 0; i < 5; i++)  
  11.           System.out.print(arr2[i] + " ");  
  12.           //2 3 4 9 9   
  13.   }  

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 用户的当前工作目录

在我们操作文件的时候很可能需要使用到我们的当前工作目录,可以用这个方法来获得。

  1. public static void main(String[] args) {  
  2.       String dirPath = System.getProperty("user.dir");  
  3.       System.out.println(dirPath);  
  4.       //输出工作目录  D:\Workspaces\MyEclipse 10\Algorithms(这是我的目录,每个人都不同)  
  5.   }  

上面的表中就不再举例了,比较常用的是后几个key。

gc——运行垃圾回收器

调用 gc 方法暗示着 Java 虚拟机做了一些努力来回收未用对象或失去了所有引用的对象,以便能够快速地重用这些对象当前占用的内存。当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间。

  1. public static void main(String[] args) {  
  2.   
  3.       Date d = new Date();  
  4.       d = null;  
  5.   
  6.       System.gc();  
  7.       // 在调用这句gc方法时,上面已经失去了d引用的new Date()被回收  
  8.   
  9.   }  

实际上我们并不一定需要调用gc()方法,让编译器自己去做好了。如果调用gc方法,会在对象被回收之前调用finalize()方法,但是我们也知道finalize()方法不一定会被调用。总之java在这回收方面做的远不如c和c++。我们可以规避有关回收方面的问题。当需要了解的时候最好专门的去看JVM回收机制的文章。

exit——退出虚拟机

exit(int)方法终止当前正在运行的 Java 虚拟机,参数解释为状态码。根据惯例,非 0 的状态码表示异常终止。 而且,该方法永远不会正常返回。 这是唯一一个能够退出程序并不执行finally的情况。

  1. public static void main(String[] args) {  
  2.   
  3.       try {  
  4.           System.out.println("this is try");  
  5.           System.exit(0);  
  6.       } catch (Exception e) {  
  7.           // TODO Auto-generated catch block  
  8.           e.printStackTrace();  
  9.       } finally {  
  10.           System.out.println("this is finally");  
  11.       }  
  12.   
  13.   }  

这段程序最后只会输出 this is try 这一句话,而不会输出 this is finally 。退出虚拟机会直接杀死整个程序,已经不是从代码的层面来终止程序了,所以finally不会执行。

例子

  1. public static void main(String[] args)   
  2.     {  
  3.         //测试arraycopy方法,注意,目的空间必须提前分配  
  4.         int[] src = {1,2,3,4,5,6,7,8,9};  
  5.         System.out.println("System.arraycopy");  
  6.         int[] dst = new int[src.length];  
  7.         System.arraycopy(src, 0, dst, 0, src.length);  
  8.         System.out.println("src = "+Arrays.toString(src));  
  9.         System.out.println("dst = "+Arrays.toString(dst));  
  10.         //同样是拷贝,Arrays.copyOf方法就不需要手动开辟空间  
  11.         System.out.println("Arrays.copyOf");  
  12.         int[] dst1 = Arrays.copyOf(src, src.length);  
  13.         System.out.println("src = "+Arrays.toString(src));  
  14.         System.out.println("dst1 = "+Arrays.toString(dst1));  
  15.   
  16.         //测试currentTimeMillis()  
  17.         System.out.println("currentTimeMillis "+System.currentTimeMillis());  
  18.         //测试nanoTime(),单独输出的结果没有仍和意义,此函数只能用来计算时间差  
  19.         System.out.println("nanoTime "+System.nanoTime());  
  20.         long dt=System.nanoTime();  
  21.         dt = dt - System.nanoTime();  
  22.         System.out.println("dt = "+dt);  
  23.   
  24.         //测试getenv(),注意遍历Map的用法,不是很理解  
  25.         System.out.println("System.getenv");  
  26.         Map<String,String> env = System.getenv();  
  27.         Iterator it = env.entrySet().iterator();  
  28.         while(it.hasNext())  
  29.         {  
  30.             Map.Entry a = (Map.Entry)it.next();  
  31.             System.out.println("<"+a.getKey()+"> = <"+a.getValue()+">;");  
  32.         }  
  33.   
  34.         //getProperties(),注意遍历Map的用法,不是很理解  
  35.         System.out.println("System.getProperties");  
  36.         Properties p = System.getProperties();  
  37.         p.list(System.out);  
  38.   
  39.         System.out.println("Hello World!");  
  40.     }