欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java System学习

程序员文章站 2022-05-28 10:21:02
...



一.概述

System 类包含一些有用的类字段和方法。它不能被实例化。

System 类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。 

由于该类的构造方法是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便的进行调用。

二.初始化

   /**
     * Initialize the system class.  Called after thread initialization.
     */
    private static void initializeSystemClass() {
		props = new Properties();
		initProperties(props);
		sun.misc.Version.init();

        // Workaround until DownloadManager initialization is revisited.
        // Make JavaLangAccess available early enough for internal
        // Shutdown hooks to be registered
        setJavaLangAccess();

        // Gets and removes system properties that configure the Integer
        // cache used to support the object identity semantics of autoboxing.
        // At this time, the size of the cache may be controlled by the
        // vm option -XX:AutoBoxCacheMax=<size>.
        Integer.getAndRemoveCacheProperties();

		// 现在加载zip库,以保持java.util.zip.ZipFile尝试使用自己以后加载该库。
		// Load the zip library now in order to keep java.util.zip.ZipFile from trying to use itself to load this library later.
		loadLibrary("zip");

		// 初始化in、out、err
		FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
		FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
		FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
		setIn0(new BufferedInputStream(fdIn));
		setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
		setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true));

		// Setup Java signal handlers for HUP, TERM, and INT (where available).
        Terminator.setup();

        // Initialize any miscellenous operating system settings that need to be
        // set for the class libraries. Currently this is no-op everywhere except
        // for Windows where the process-wide error mode is set before the java.io
        // classes are used.
        sun.misc.VM.initializeOSEnvironment();

		// Set the maximum amount of direct memory.  This value is controlled
		// by the vm option -XX:MaxDirectMemorySize=<size>.  This method acts
		// as an initializer only if it is called before sun.misc.VM.booted().
		sun.misc.VM.maxDirectMemory();

		// Set a boolean to determine whether ClassLoader.loadClass accepts
		// array syntax.  This value is controlled by the system property
		// "sun.lang.ClassLoader.allowArraySyntax".  This method acts as
		// an initializer only if it is called before sun.misc.VM.booted().
		sun.misc.VM.allowArraySyntax();

		// Subsystems that are invoked during initialization can invoke
		// sun.misc.VM.isBooted() in order to avoid doing things that should
		// wait until the application class loader has been set up.
		sun.misc.VM.booted();

        // The main thread is not added to its thread group in the same
        // way as other threads; we must do it ourselves here.
        Thread current = Thread.currentThread();
        current.getThreadGroup().add(current);
    }

三.静态成员变量

1.静态成员变量

Java System学习

2.测试代码

package system;

public class TestSystem {

	public static void main(String[] args) {
		System.out.println("System.in.toString() = " + System.in.toString());
		System.out.println("System.out.toString() = " + System.out.toString());
		System.out.println("System.err.toString() = " + System.err.toString());
	}
}

3.测试结果

Java System学习

四.静态方法

1.获取属性 - System.getProperty(key)

Java System学习

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.1测试代码

package system;

import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;

public class TestProperty {
	public static void main(String[] args) {
		System.out.println("Java运行时环境版本:" + System.getProperty("java.version"));
		System.out.println("Java运行时环境供应商:" + System.getProperty("java.vendor"));
		System.out.println("Java供应商的URL: " + System.getProperty("java.vendor.url"));
		System.out.println("Java安装目录: " + System.getProperty("java.home"));
		System.out.println();
		System.out.println("*******************************************************");
		System.out.println("Java虚拟机规范版本:" + System.getProperty("java.vm.specification.version"));
		System.out.println("Java虚拟机规范供应商:" + System.getProperty("java.vm.specification.vendor"));
		System.out.println("Java虚拟机规范名称:" + System.getProperty("java.vm.specification.name"));
		System.out.println("Java虚拟机实现版本:" + System.getProperty("java.vm.version"));
		System.out.println("Java虚拟机实现供应商:" + System.getProperty("java.vm.vendor"));
		System.out.println("Java虚拟机实现名称:" + System.getProperty("java.vm.name"));
		System.out.println();
		System.out.println("*******************************************************");
		System.out.println("Java运行时环境规范版本:" + System.getProperty("java.specification.version"));
		System.out.println("Java运行时环境规范供应商:" + System.getProperty("java.specification.vendor"));
		System.out.println("Java运行时环境规范名称:" + System.getProperty("java.specification.name"));
		System.out.println("Java类格式版本号:" + System.getProperty("java.class.version"));
		System.out.println("Java类路径:" + System.getProperty("java.class.path"));
		System.out.println();
		System.out.println("********************************************************");
		System.out.println("加载库时搜索的路径列表:" + System.getProperty("java.library.path"));
		System.out.println("默认的临时文件路径:" + System.getProperty("java.io.tmpdir"));
		System.out.println("要使用的JIT编译器的名称:" + System.getProperty("java.compiler"));
		System.out.println("一个或多个扩展文件的路径:" + System.getProperty("java.ext.dirs"));
		System.out.println();
		System.out.println("********************************************************");
		System.out.println("操作系统的名称:" + System.getProperty("os.name"));
		System.out.println("操作系统的架构:" + System.getProperty("os.arch"));
		System.out.println("操作系统的版本:" + System.getProperty("os.version"));
		System.out.println("文件分隔符(在UNIX系统中是'/'):" + System.getProperty("file.separator"));
		System.out.println("路径分隔符(在UNIX系统是':'):" + System.getProperty("path.separator"));
		System.out.println("行分隔符(在UNIX系统中是'/n'):" + System.getProperty("line.separator"));
		System.out.println("用户的账户名称:" + System.getProperty("user.name"));
		System.out.println("用户的主目录:" + System.getProperty("user.home"));
		System.out.println("用户的当前工作目录:" + System.getProperty("user.dir"));
		System.out.println();
		
		Properties properties = System.getProperties();
		Set<Entry<Object, Object>> entrySet = properties.entrySet();
		for (Entry<Object, Object> entry : entrySet) {
			System.out.println(entry.getKey() + " = " + entry.getValue());
		}
	}
}

1.2.测试结果

Java运行时环境版本:1.6.0_16
Java运行时环境供应商:Sun Microsystems Inc.
Java供应商的URL: http://java.sun.com/
Java安装目录: D:\esendev\jdk1.6\jre

*******************************************************
Java虚拟机规范版本:1.0
Java虚拟机规范供应商:Sun Microsystems Inc.
Java虚拟机规范名称:Java Virtual Machine Specification
Java虚拟机实现版本:14.2-b01
Java虚拟机实现供应商:Sun Microsystems Inc.
Java虚拟机实现名称:Java HotSpot(TM) Client VM

*******************************************************
Java运行时环境规范版本:1.6
Java运行时环境规范供应商:Sun Microsystems Inc.
Java运行时环境规范名称:Java Platform API Specification
Java类格式版本号:50.0
Java类路径:D:\esendev\gitrepos\POI\build\classes;D:\esendev\apache-tomcat-5.5\common\lib\commons-el.jar;D:\esendev\apache-tomcat-5.5\common\lib\jasper-compiler-jdt.jar;D:\esendev\apache-tomcat-5.5\common\lib\jasper-compiler.jar;D:\esendev\apache-tomcat-5.5\common\lib\jasper-runtime.jar;D:\esendev\apache-tomcat-5.5\common\lib\jsp-api.jar;D:\esendev\apache-tomcat-5.5\common\lib\naming-factory-dbcp.jar;D:\esendev\apache-tomcat-5.5\common\lib\naming-factory.jar;D:\esendev\apache-tomcat-5.5\common\lib\naming-resources.jar;D:\esendev\apache-tomcat-5.5\common\lib\servlet-api.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\poi-3.16.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\poi-examples-3.16.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\poi-excelant-3.16.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\poi-ooxml-3.16.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\poi-ooxml-schemas-3.16.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\poi-scratchpad-3.16.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\lib\commons-codec-1.10.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\lib\commons-collections4-4.1.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\lib\commons-logging-1.2.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\lib\junit-4.12.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\lib\log4j-1.2.17.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\ooxml-lib\curvesapi-1.04.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\ooxml-lib\xmlbeans-2.6.0.jar

********************************************************
加载库时搜索的路径列表:D:\esendev\jdk1.6\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:/esendev/jdk1.6/bin/../jre/bin/client;D:/esendev/jdk1.6/bin/../jre/bin;D:/esendev/jdk1.6/bin/../jre/lib/i386;D:\mysql\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;D:\esendev\jdk1.6\bin;D:\esendev\jdk1.6\jre\bin;D:\apache-tomcat-8.0.37\lib;D:\apache-tomcat-8.0.37\bin;D:\esendev\eclipse4git;
默认的临时文件路径:C:\Users\ADMINI~1\AppData\Local\Temp\
要使用的JIT编译器的名称:null
一个或多个扩展文件的路径:D:\esendev\jdk1.6\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext

********************************************************
操作系统的名称:Windows NT (unknown)
操作系统的架构:x86
操作系统的版本:6.2
文件分隔符(在UNIX系统中是'/'):\
路径分隔符(在UNIX系统是':'):;
行分隔符(在UNIX系统中是'/n'):

用户的账户名称:Administrator
用户的主目录:C:\Users\Administrator
用户的当前工作目录:D:\esendev\gitrepos\POI

java.runtime.name = Java(TM) SE Runtime Environment
sun.boot.library.path = D:\esendev\jdk1.6\jre\bin
java.vm.version = 14.2-b01
java.vm.vendor = Sun Microsystems Inc.
java.vendor.url = http://java.sun.com/
path.separator = ;
java.vm.name = Java HotSpot(TM) Client VM
file.encoding.pkg = sun.io
sun.java.launcher = SUN_STANDARD
user.country = CN
sun.os.patch.level = 
java.vm.specification.name = Java Virtual Machine Specification
user.dir = D:\esendev\gitrepos\POI
java.runtime.version = 1.6.0_16-b01
java.awt.graphicsenv = sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs = D:\esendev\jdk1.6\jre\lib\endorsed
os.arch = x86
java.io.tmpdir = C:\Users\ADMINI~1\AppData\Local\Temp\
line.separator = 

java.vm.specification.vendor = Sun Microsystems Inc.
user.variant = 
os.name = Windows NT (unknown)
sun.jnu.encoding = GBK
java.library.path = D:\esendev\jdk1.6\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:/esendev/jdk1.6/bin/../jre/bin/client;D:/esendev/jdk1.6/bin/../jre/bin;D:/esendev/jdk1.6/bin/../jre/lib/i386;D:\mysql\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;D:\esendev\jdk1.6\bin;D:\esendev\jdk1.6\jre\bin;D:\apache-tomcat-8.0.37\lib;D:\apache-tomcat-8.0.37\bin;D:\esendev\eclipse4git;
java.specification.name = Java Platform API Specification
java.class.version = 50.0
sun.management.compiler = HotSpot Client Compiler
os.version = 6.2
user.home = C:\Users\Administrator
user.timezone = 
java.awt.printerjob = sun.awt.windows.WPrinterJob
file.encoding = UTF-8
java.specification.version = 1.6
java.class.path = D:\esendev\gitrepos\POI\build\classes;D:\esendev\apache-tomcat-5.5\common\lib\commons-el.jar;D:\esendev\apache-tomcat-5.5\common\lib\jasper-compiler-jdt.jar;D:\esendev\apache-tomcat-5.5\common\lib\jasper-compiler.jar;D:\esendev\apache-tomcat-5.5\common\lib\jasper-runtime.jar;D:\esendev\apache-tomcat-5.5\common\lib\jsp-api.jar;D:\esendev\apache-tomcat-5.5\common\lib\naming-factory-dbcp.jar;D:\esendev\apache-tomcat-5.5\common\lib\naming-factory.jar;D:\esendev\apache-tomcat-5.5\common\lib\naming-resources.jar;D:\esendev\apache-tomcat-5.5\common\lib\servlet-api.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\poi-3.16.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\poi-examples-3.16.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\poi-excelant-3.16.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\poi-ooxml-3.16.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\poi-ooxml-schemas-3.16.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\poi-scratchpad-3.16.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\lib\commons-codec-1.10.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\lib\commons-collections4-4.1.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\lib\commons-logging-1.2.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\lib\junit-4.12.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\lib\log4j-1.2.17.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\ooxml-lib\curvesapi-1.04.jar;E:\软件\POI\poi-bin-3.16-20170419\poi-3.16\ooxml-lib\xmlbeans-2.6.0.jar
user.name = Administrator
java.vm.specification.version = 1.0
java.home = D:\esendev\jdk1.6\jre
sun.arch.data.model = 32
user.language = zh
java.specification.vendor = Sun Microsystems Inc.
awt.toolkit = sun.awt.windows.WToolkit
java.vm.info = mixed mode
java.version = 1.6.0_16
java.ext.dirs = D:\esendev\jdk1.6\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
sun.boot.class.path = D:\esendev\jdk1.6\jre\lib\resources.jar;D:\esendev\jdk1.6\jre\lib\rt.jar;D:\esendev\jdk1.6\jre\lib\sunrsasign.jar;D:\esendev\jdk1.6\jre\lib\jsse.jar;D:\esendev\jdk1.6\jre\lib\jce.jar;D:\esendev\jdk1.6\jre\lib\charsets.jar;D:\esendev\jdk1.6\jre\classes
java.vendor = Sun Microsystems Inc.
file.separator = \
java.vendor.url.bug = http://java.sun.com/cgi-bin/bugreport.cgi
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
sun.desktop = windows
sun.cpu.isalist = pentium_pro+mmx pentium_pro pentium+mmx pentium i486 i386 i86

2.数组操作

src 引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。被复制的组件的编号等于length 参数。源数组中位置在 srcPossrcPos+length-1 之间的组件被分别复制到目标数组中的destPosdestPos+length-1 位置。
参数:src - 源数组。srcPos - 源数组中的起始位置。dest - 目标数组。destPos - 目标数据中的起始位置。length - 要复制的数组元素的数量。 
Java System学习

只要下列任何情况为真,则抛出 IndexOutOfBoundsException 异常,并且不会修改目标数组:

  • srcPos 参数为负。
  • destPos 参数为负。
  • length 参数为负。
  • srcPos+length 大于 src.length,即源数组的长度。
  • destPos+length 大于 dest.length,即目标数组的长度。 

2.1测试代码

package system;

public class TestArraycopy {

	public static void main(String[] args) {
		int [] src = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
		int [] dest = new int[10];
		System.arraycopy(src, 0, dest, 0, 10);
		System.out.println(pringtArray(dest));
		System.out.println();
		
		int [] dest1 = new int[10];
		System.arraycopy(src, 5, dest1, 0, 5);
		System.out.println(pringtArray(dest1));
		System.out.println();
		
		int [] dest2 = new int[10];
		System.arraycopy(src, 5, dest2, 5, 5);
		System.out.println(pringtArray(dest2));
		System.out.println();
		
//		int [] dest3 = new int[10];
//		System.arraycopy(src, 0, dest3, 0, 11);
//		System.out.println(pringtArray(dest3));
//		System.out.println();
		
		int [] dest4 = new int[10];
		System.arraycopy(src, 0, dest4, 5, 6);
		System.out.println(pringtArray(dest4));
		System.out.println();
	}

	private static String pringtArray(int[] dest) {
		StringBuffer sb = new StringBuffer();
		for (int item : dest) {
			sb.append(item).append(", ");
		}
		String str = sb.toString();
		int length = str.length();
		if (length == 0) {
			return null;
		} else {
			return sb.substring(0, length-2);
		}
	}
}

2.2测试结果

0, 1, 2, 3, 4, 5, 6, 7, 8, 9

5, 6, 7, 8, 9, 0, 0, 0, 0, 0

0, 0, 0, 0, 0, 5, 6, 7, 8, 9

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
	at java.lang.System.arraycopy(Native Method)
	at system.TestArraycopy.main(TestArraycopy.java:28)

3.获取时间

返回以毫秒为单位的当前时间。注意,当返回值的时间单位是毫秒时,值的粒度取决于底层操作系统,并且粒度可能更大。例如,许多操作系统以几十毫秒为单位测量时间。
当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。
Java System学习

返回最准确的可用系统计时器的当前值,以纳秒为单位。

此方法只能用于测量已过的时间,与系统或钟表时间的其他任何时间概念无关。返回值表示从某一固定但任意的时间算起的毫微秒数(或许从以后算起,所以该值可能为负)。此方法提供毫微秒的精度,但不是必要的毫微秒的准确度。它对于值的更改频率没有作出保证。在取值范围大于约 292 年(263 毫微秒)的连续调用的不同点在于:由于数字溢出,将无法准确计算已过的时间。 

Java System学习

3.1测试代码

package system;

public class TestTime {

	public static void main(String[] args) throws InterruptedException {
		long start = System.currentTimeMillis();
		Thread.sleep(1000);
		System.out.println("耗时:" + (System.currentTimeMillis() - start) + "毫秒");
		
		/**
		 * System.nanoTime()是基于cpu核心的时钟周期来计时,它的开始时间是不确定的
		 * 在多核处理器上,由于每个核心的开始时间不确定
		 * 这段代码有可能会运行在两个不同的cpu核心上,从而导致得到的结果完全不符逻辑
		 * */
		long startNano = System.nanoTime();
		Thread.sleep(1000);
		System.out.println("耗时:" + (System.nanoTime() - startNano) + "纳秒");
	}

}

3.2测试结果

耗时:1000毫秒
耗时:999958536纳秒