java 之 System

一、源码

java.lang.System:


package java.lang;

import 。。。。。

/**
 * 系统类包含几个有用的类字段和方法。它不能实例化。
 *
 * 提供的功能包括标准输入、标准输出和错误输出流;
 * 访问外部定义的属性和环境变量;加载文件和库的方法;以及快速复制数组的一部分的实用方法。
 */
public final class System {

    /* 通过静态初始化器注册本机变量。
     *
     * VM将调用initializeSystemClass方法来完成与clinit分离的这个类的初始化。
     */
    private static native void registerNatives();
    static {
        registerNatives();
    }

    /** 私有构造器 */
    private System() {
    }

    /**
     * “标准”输入流。这个流已经打开,准备提供输入数据。通常,该流对应于键盘输入或主机环境或用户指定的另一个输入源。
     */
    public final static InputStream in = null;

    /**
     * “标准”输出流。这个流已经打开并准备接受输出数据。通常,此流对应于显示输出或主机环境或用户指定的另一个输出目的地。
     */
    public final static PrintStream out = null;

    /**
     * “标准”错误输出流。这个流已经打开并准备接受输出数据。
     */
    public final static PrintStream err = null;

    /* 系统的安全管理器。
     */
    private static volatile SecurityManager security = null;

    /**
     * 重新分配“标准”输入流。
     * 首先,如果存在安全管理器,则使用' RuntimePermission("setIO ") '权限调用其checkPermission方法,
     * 以查看是否可以重新分配“标准”输入流。
     *
     * @throws SecurityException
     *        如果存在安全管理器,且其checkPermission方法不允许重新分配标准输入流。
     */
    public static void setIn(InputStream in) {
        checkIO();
        setIn0(in);
    }

    /**
     * 重新分配“标准”输出流。
     *
     * 校验部分同setIn
     *
     * @throws SecurityException
     *        同setIn
     */
    public static void setOut(PrintStream out) {
        checkIO();
        setOut0(out);
    }

    /**
     * 重新分配“标准”错误输出流。
     *
     * 同setIn
     */
    public static void setErr(PrintStream err) {
        checkIO();
        setErr0(err);
    }

    private static volatile Console cons = null;
    /**
     * 返回与当前Java虚拟机关联的唯一的“{Console}”对象(如果有的话)。
     * @since   1.6
     */
     public static Console console() {
         if (cons == null) {
             synchronized (System.class) {
                 cons = sun.misc.SharedSecrets.getJavaIOAccess().console();
             }
         }
         return cons;
     }

    /**
     * 返回从创建此Java虚拟机的实体继承的通道。
     * @since 1.5
     */
    public static Channel inheritedChannel() throws IOException {
        return SelectorProvider.provider().inheritedChannel();
    }

    private static void checkIO() {
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new RuntimePermission("setIO"));
        }
    }

    private static native void setIn0(InputStream in);
    private static native void setOut0(PrintStream out);
    private static native void setErr0(PrintStream err);

    /**
     * 设置系统安全性。
     *
     * 如果已经安装了安全管理器,则此方法首先使用“RuntimePermission”权限调用安全管理器的“checkPermission”方法,以确保可以替换现有的安全管理器。
     */
    public static void setSecurityManager(final SecurityManager s) {
        try {
            s.checkPackageAccess("java.lang");
        } catch (Exception e) {
            // no-op
        }
        setSecurityManager0(s);
    }

    private static synchronized void setSecurityManager0(final SecurityManager s) {
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            // 询问当前安装的安全管理器是否可以替换它。
            sm.checkPermission(new RuntimePermission("setSecurityManager"));
        }

        if ((s != null) && (s.getClass().getClassLoader() != null)) {
            AccessController.doPrivileged(new PrivilegedAction<Object>() {
                public Object run() {
                    s.getClass().getProtectionDomain().implies
                        (SecurityConstants.ALL_PERMISSION);
                    return null;
                }
            });
        }

        security = s;
    }

    /**
     * 获取系统安全接口。
     */
    public static SecurityManager getSecurityManager() {
        return security;
    }

    /**
     * 返回当前时间(以毫秒为单位)。注意,虽然返回值的时间单位是毫秒,但是该值的粒度取决于底层操作系统,可能更大。例如,许多操作系统以数十毫秒为单位度量时间。
     *
     * @return  当前时间与1970年1月1日世界时午夜之间的差,以毫秒为单位。
     */
    public static native long currentTimeMillis();

    /**
     * 返回正在运行的Java虚拟机的高分辨率时间源的当前值,单位为纳秒。
     *
     * 此方法只能用于测量运行时间,与系统或时钟时间的任何其他概念无关。
     * 返回的值表示自某个固定但任意的起始时间以来的纳秒(可能在将来,所以值可能是负数)。此方法在Java虚拟机实例中的所有调用都使用相同的源;其他虚拟机实例可能使用不同的源。
     * 此方法提供纳秒精度,但不一定是纳秒分辨率(即值更改的频率)
     * ——除了分辨率至少与currentTimeMillis()的分辨率相同外,不作任何保证。
     *
     * 只有在计算在Java虚拟机的相同实例中获得的两个值之间的差值时,此方法返回的值才有意义。
     *
     * <p> For example, to measure how long some code takes to execute:
     *  <pre> {@code
     * long startTime = System.nanoTime();
     * // ... the code being measured ...
     * long estimatedTime = System.nanoTime() - startTime;}</pre>
     *
     * <p>To compare two nanoTime values
     *  <pre> {@code
     * long t0 = System.nanoTime();
     * ...
     * long t1 = System.nanoTime();}</pre>
     *
     * one should use {@code t1 - t0 < 0}, not {@code t1 < t0},
     * because of the possibility of numerical overflow.
     *
     * @return 正在运行的Java虚拟机的高分辨率时间源的当前值,以纳秒为单位
     * @since 1.5
     */
    public static native long nanoTime();

    /**
     * 将数组从指定的源数组(从指定的位置开始)复制到目标数组的指定位置。
     * 将数组从src所引用的源数组复制到dest所引用的目标数组。复制的组件数量等于length。
     * 将源数组中位于srcPos到srcPos+length-1处的组件分别复制到目的数组中位于destPos到destPos+length-1处的组件。
     *
     * @param      src      the source array.
     * @param      srcPos   starting position in the source array.
     * @param      dest     the destination array.
     * @param      destPos  starting position in the destination data.
     * @param      length   the number of array elements to be copied.
     * @exception  IndexOutOfBoundsException  数组越界
     * @exception  ArrayStoreException  类型不匹配
     * @exception  NullPointerException src或者dest为null
     */
    public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

    /**
     * 为给定对象返回与默认方法hashCode()返回的相同的散列代码,无论给定对象的类是否覆盖hashCode()。
     * 空引用的哈希码为零。
     * 如果对象重写了,则将会不一致
     */
    public static native int identityHashCode(Object x);

    /**
     * 系统属性。保证定义以下属性:
     * <dl>
     * <dt>java.version         <dd>Java version number
     * <dt>java.vendor          <dd>Java vendor specific string
     * <dt>java.vendor.url      <dd>Java vendor URL
     * <dt>java.home            <dd>Java installation directory
     * <dt>java.class.version   <dd>Java class version number
     * <dt>java.class.path      <dd>Java classpath
     * <dt>os.name              <dd>Operating System Name
     * <dt>os.arch              <dd>Operating System Architecture
     * <dt>os.version           <dd>Operating System Version
     * <dt>file.separator       <dd>File separator ("/" on Unix)
     * <dt>path.separator       <dd>Path separator (":" on Unix)
     * <dt>line.separator       <dd>Line separator ("\n" on Unix)
     * <dt>user.name            <dd>User account name
     * <dt>user.home            <dd>User home directory
     * <dt>user.dir             <dd>User's current working directory
     * </dl>
     */
    private static Properties props;
    private static native Properties initProperties(Properties props);

    /**
     * 获取当前系统属性。
     * java.version: Java Runtime Environment version
     * java.vendor: Java Runtime Environment vendor
     * java.vendor.url: Java vendor URL
     * java.home: Java installation directory
     * java.vm.specification.version: Java Virtual Machine specification version
     * java.vm.specification.vendor: Java Virtual Machine specification vendor
     * java.vm.specification.name: Java Virtual Machine specification name
     * java.vm.version: Java Virtual Machine implementation version
     * java.vm.vendor: Java Virtual Machine implementation vendor
     * java.vm.name: Java Virtual Machine implementation name
     * java.specification.version: Java Runtime Environment specification  version
     * java.specification.vendor: Java Runtime Environment specification  vendor
     * java.specification.name: Java Runtime Environment specification  name
     * java.class.version: Java class format version number
     * java.class.path: Java class path
     * java.library.path: List of paths to search when loading libraries
     * java.io.tmpdir: Default temp file path
     * java.compiler: Name of JIT compiler to use
     * java.ext.dirs: Path of extension directory or directories(未来版本可能删除)
     * os.name: Operating system name
     * os.arch: Operating system architecture
     * os.version: Operating system version
     * file.separator: File separator ("/" on UNIX)
     * path.separator: Path separator (":" on UNIX)
     * line.separator: Line separator ("\n" on UNIX)
     * user.name: User's account name
     * user.home: User's home directory
     * user.dir: User's current working directory
     * 系统属性值中的多个路径由平台的路径分隔符分隔。
     */
    public static Properties getProperties() {
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPropertiesAccess();
        }

        return props;
    }

    /**
     * R返回与系统相关的行分隔符字符串。
     * 与getProperties("line.separator")总是一致
     *
     * 在UNIX系统上,它返回 "\n" ;在Microsoft Windows系统上,它返回 "\r\n" 。
     * @since 1.7
     */
    public static String lineSeparator() {
        return lineSeparator;
    }

    private static String lineSeparator;

    /**
     * 设置系统属性
     */
    public static void setProperties(Properties props) {
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPropertiesAccess();
        }
        if (props == null) {
            props = new Properties();
            initProperties(props);
        }
        System.props = props;
    }

    /**
     * 根据key获取系统某个属性
     */
    public static String getProperty(String key) {
        checkKey(key);
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPropertyAccess(key);
        }

        return props.getProperty(key);
    }

    public static String getProperty(String key, String def) {
        checkKey(key);
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPropertyAccess(key);
        }

        return props.getProperty(key, def);
    }

    /**
     * 设置系统属性中的某个值
     * @since      1.2
     */
    public static String setProperty(String key, String value) {
        checkKey(key);
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new PropertyPermission(key,
                SecurityConstants.PROPERTY_WRITE_ACTION));
        }

        return (String) props.setProperty(key, value);
    }

    /**
     * 移除系统属性中的某个值
     * @since 1.5
     */
    public static String clearProperty(String key) {
        checkKey(key);
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new PropertyPermission(key, "write"));
        }

        return (String) props.remove(key);
    }

    private static void checkKey(String key) {
        if (key == null) {
            throw new NullPointerException("key can't be null");
        }
        if (key.equals("")) {
            throw new IllegalArgumentException("key can't be empty");
        }
    }

    /**
     * 获取指定环境变量的值。环境变量是依赖于系统的外部命名值。
     */
    public static String getenv(String name) {
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new RuntimePermission("getenv."+name));
        }

        return ProcessEnvironment.getenv(name);
    }


    /**
     * 返回当前系统环境的不可修改字符串映射视图。环境是一个从名称到值的依赖于系统的映射,该映射从父进程传递到子进程。
     * @since  1.5
     */
    public static java.util.Map<String,String> getenv() {
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new RuntimePermission("getenv.*"));
        }

        return ProcessEnvironment.getenv();
    }

    /**
     * 终止当前正在运行的Java虚拟机。
     * 参数用作状态代码;按照惯例,非零状态码表示异常终止。
     */
    public static void exit(int status) {
        Runtime.getRuntime().exit(status);
    }

    /**
     * Runs the garbage collector.
     * 调用<code>gc</code>方法表明,Java虚拟机将努力回收未使用的对象,以使它们当前占用的内存能够快速重用。
     * 当控件从方法调用返回时,Java虚拟机已经尽力从所有丢弃的对象中回收空间。
     * 也就意味着即使显示的调用gc()方法,java虚拟机也不一定执行。
     */
    public static void gc() {
        Runtime.getRuntime().gc();
    }

    /**
     * 运行任何挂起终结的对象的终结方法。
     * 调用此方法意味着Java虚拟机将花费大量精力运行已被丢弃但其“finalize”方法尚未运行的对象的“finalize”方法。
     * 当控件从方法调用返回时,Java虚拟机已经尽力完成所有未完成的收尾工作。
     */
    public static void runFinalization() {
        Runtime.getRuntime().runFinalization();
    }

   
    @Deprecated
    public static void runFinalizersOnExit(boolean value) {
        Runtime.runFinalizersOnExit(value);
    }

    /**
     * 加载文件名参数指定的本机库。文件名参数必须是绝对路径名。
     */
    @CallerSensitive
    public static void load(String filename) {
        Runtime.getRuntime().load0(Reflection.getCallerClass(), filename);
    }

    
    @CallerSensitive
    public static void loadLibrary(String libname) {
        Runtime.getRuntime().loadLibrary0(Reflection.getCallerClass(), libname);
    }

    /**
     * 将库名映射到表示本机库的特定于平台的字符串中。
     *
     * @param      libname the name of the library.
     * @return     a platform-dependent native library name.
     * @exception  NullPointerException if <code>libname</code> is
     *             <code>null</code>
     * @see        java.lang.System#loadLibrary(java.lang.String)
     * @see        java.lang.ClassLoader#findLibrary(java.lang.String)
     * @since      1.2
     */
    public static native String mapLibraryName(String libname);

    
    private static PrintStream newPrintStream(FileOutputStream fos, String enc) {
       if (enc != null) {
            try {
                return new PrintStream(new BufferedOutputStream(fos, 128), true, enc);
            } catch (UnsupportedEncodingException uee) {}
        }
        return new PrintStream(new BufferedOutputStream(fos, 128), true);
    }


    /**
     * 初始化系统类。线程初始化后调用。
     */
    private static void initializeSystemClass() {

        props = new Properties();
        initProperties(props);  // initialized by the VM

        sun.misc.VM.saveAndRemoveProperties(props);


        lineSeparator = props.getProperty("line.separator");
        sun.misc.Version.init();

        FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
        FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
        FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
        setIn0(new BufferedInputStream(fdIn));
        setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));
        setErr0(newPrintStream(fdErr, props.getProperty("sun.stderr.encoding")));

        // 现在加载zip库,以保持java.util.zip.ZipFile,以避免稍后试图使用自己来加载此库。
        loadLibrary("zip");

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

        sun.misc.VM.initializeOSEnvironment();

        // 主线程不像其他线程那样被添加到它的线程组中;我们必须自己来做。
        Thread current = Thread.currentThread();
        current.getThreadGroup().add(current);

        // register shared secrets
        setJavaLangAccess();

        sun.misc.VM.booted();
    }

    private static void setJavaLangAccess() {
        // Allow privileged classes outside of java.lang
        sun.misc.SharedSecrets.setJavaLangAccess(new sun.misc.JavaLangAccess(){
            public sun.reflect.ConstantPool getConstantPool(Class<?> klass) {
                return klass.getConstantPool();
            }
            public boolean casAnnotationType(Class<?> klass, AnnotationType oldType, AnnotationType newType) {
                return klass.casAnnotationType(oldType, newType);
            }
            public AnnotationType getAnnotationType(Class<?> klass) {
                return klass.getAnnotationType();
            }
            public Map<Class<? extends Annotation>, Annotation> getDeclaredAnnotationMap(Class<?> klass) {
                return klass.getDeclaredAnnotationMap();
            }
            public byte[] getRawClassAnnotations(Class<?> klass) {
                return klass.getRawAnnotations();
            }
            public byte[] getRawClassTypeAnnotations(Class<?> klass) {
                return klass.getRawTypeAnnotations();
            }
            public byte[] getRawExecutableTypeAnnotations(Executable executable) {
                return Class.getExecutableTypeAnnotationBytes(executable);
            }
            public <E extends Enum<E>>
                    E[] getEnumConstantsShared(Class<E> klass) {
                return klass.getEnumConstantsShared();
            }
            public void blockedOn(Thread t, Interruptible b) {
                t.blockedOn(b);
            }
            public void registerShutdownHook(int slot, boolean registerShutdownInProgress, Runnable hook) {
                Shutdown.add(slot, registerShutdownInProgress, hook);
            }
            public int getStackTraceDepth(Throwable t) {
                return t.getStackTraceDepth();
            }
            public StackTraceElement getStackTraceElement(Throwable t, int i) {
                return t.getStackTraceElement(i);
            }
            public String newStringUnsafe(char[] chars) {
                return new String(chars, true);
            }
            public Thread newThreadWithAcc(Runnable target, AccessControlContext acc) {
                return new Thread(target, acc);
            }
            public void invokeFinalize(Object o) throws Throwable {
                o.finalize();
            }
        });
    }
}

初始化过程:

通过静态代码块,调用registerNatives()本地方法,

    /* 通过静态初始化器注册本机变量。
     *
     * VM将调用initializeSystemClass方法来完成与clinit分离的这个类的初始化。
     */
    private static native void registerNatives();
    static {
        registerNatives();
    }

由java虚拟机调用initializeSystemClass()方法来初始化该类中的变量。

    /**
     * 初始化系统类。线程初始化后调用。
     */
    private static void initializeSystemClass() {

        props = new Properties();
        initProperties(props);  // initialized by the VM

        sun.misc.VM.saveAndRemoveProperties(props);


        lineSeparator = props.getProperty("line.separator");
        sun.misc.Version.init();

        FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
        FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
        FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
        setIn0(new BufferedInputStream(fdIn));
        setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));
        setErr0(newPrintStream(fdErr, props.getProperty("sun.stderr.encoding")));

        // 现在加载zip库,以保持java.util.zip.ZipFile,以避免稍后试图使用自己来加载此库。
        loadLibrary("zip");

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

        sun.misc.VM.initializeOSEnvironment();

        // 主线程不像其他线程那样被添加到它的线程组中;我们必须自己来做。
        Thread current = Thread.currentThread();
        current.getThreadGroup().add(current);

        // register shared secrets
        setJavaLangAccess();

        sun.misc.VM.booted();
    }

可以看到in, out, err具体是哪种流。

 

二、解析(主要方法)

1、构造方法

    private System() {
    }

 System类代表系统,系统级的部分属性和控制方法都在该类中,该类是final的,并且构造器是私有的;但是提供了很多的static方法和成员变量,方便使用。

 

2、成员变量

    /**
     * “标准”输入流。这个流已经打开,准备提供输入数据。通常,该流对应于键盘输入或主机环境或用户指定的另一个输入源。
     */
    public final static InputStream in = null;

    /**
     * “标准”输出流。这个流已经打开并准备接受输出数据。通常,此流对应于显示输出或主机环境或用户指定的另一个输出目的地。
     */
    public final static PrintStream out = null;

    /**
     * “标准”错误输出流。这个流已经打开并准备接受输出数据。
     */
    public final static PrintStream err = null;

System内部有 in、out、err三个标准的输入输出流,具体的初始化详见initializeSystemClass私有方法;实现示例如下:

A、控制台输入

    public static void main(String[] args) {
		System.out.println("start to test, please enter characters and use 'exit' to exit ....");

		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		String input;
		try {
			while (!(input = reader.readLine()).equals("exit")) {
				System.out.println(input);
			}
		} catch (IOException e) {
			System.err.println("error:" + e.getMessage());
		}
		System.out.println("end");
	}

B、 重定向

public class Main {
	private static String pathname = "/Users/wuzhengya/Desktop/out.txt";

	public static void main(String[] args) {
		PrintStream stream = null;
		PrintStream out = System.out;
		PrintStream err = System.err; 
		File file = new File(pathname);
		try {
			if (!file.exists())
				file.createNewFile();
			stream = new PrintStream(new FileOutputStream(file));
			//重定向到out.txt文件中
			System.setOut(stream);
			System.setErr(stream);
			System.out.println("out to file");
			System.err.println("error to file");

			//重定向回console
			System.setOut(out);
			System.setErr(err);
			System.out.println("out to console");
			System.err.println("error to console");
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (null != stream)
				stream.close();
		}
	}
}

注意:在正式环境中,不建议使用System.out或者System.in打印信息,由于运行在同一线程,故会阻塞直至动作完成,占用资源;建议使用log4j等异步日志工具。

性能问题参考:System.out.println()标准输出方法性能影响一窥 

3、重定向

/**
     * 重新分配“标准”输入流。
     * 首先,如果存在安全管理器,则使用' RuntimePermission("setIO ") '权限调用其checkPermission方法,
     * 以查看是否可以重新分配“标准”输入流。
     *
     * @throws SecurityException
     *        如果存在安全管理器,且其checkPermission方法不允许重新分配标准输入流。
     */
    public static void setIn(InputStream in) {
        checkIO();
        setIn0(in);
    }

    /**
     * 重新分配“标准”输出流。
     *
     * 校验部分同setIn
     *
     * @throws SecurityException
     *        同setIn
     */
    public static void setOut(PrintStream out) {
        checkIO();
        setOut0(out);
    }

    /**
     * 重新分配“标准”错误输出流。
     *
     * 同setIn
     */
    public static void setErr(PrintStream err) {
        checkIO();
        setErr0(err);
    }

 可以改变标准输入、输出流等,如可以输出日志到文件中等。

 

4、console()

返回与当前虚拟机关联的唯一console对象(可能为null),详见console解析

 

5、时间处理

    /**
     * 返回当前时间(以毫秒为单位)。注意,虽然返回值的时间单位是毫秒,但是该值的粒度取决于底层操作系统,可能更大。例如,许多操作系统以数十毫秒为单位度量时间。
     *
     * @return  当前时间与1970年1月1日世界时午夜之间的差,以毫秒为单位。
     */
    public static native long currentTimeMillis();

得到的是与GMT时间(1970-01-01 00:00:00)的毫秒差值。

 

6、数组复制arraycopy()

    /**
     * 将数组从指定的源数组(从指定的位置开始)复制到目标数组的指定位置。
     * 将数组从src所引用的源数组复制到dest所引用的目标数组。复制的组件数量等于length。
     * 将源数组中位于srcPos到srcPos+length-1处的组件分别复制到目的数组中位于destPos到destPos+length-1处的组件。
     *
     * @param      src      the source array.
     * @param      srcPos   starting position in the source array.
     * @param      dest     the destination array.
     * @param      destPos  starting position in the destination data.
     * @param      length   the number of array elements to be copied.
     * @exception  IndexOutOfBoundsException  数组越界
     * @exception  ArrayStoreException  类型不匹配
     * @exception  NullPointerException src或者dest为null
     */
    public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

该方法是将指定的源数组复制到目标数组,由于是native方法,性能上有很大优势。

 

7、系统属性

    /**
     * 获取当前系统属性。
     */
    public static Properties getProperties();

    /**
     * 设置系统属性
     */
    public static void setProperties(Properties props);

    /**
     * 根据key获取系统某个属性
     */
    public static String getProperty(String key);

    public static String getProperty(String key, String def);

    /**
     * 设置系统属性中的某个值
     * @since      1.2
     */
    public static String setProperty(String key, String value);

    /**
     * 移除系统属性中的某个值
     * @since 1.5
     */
    public static String clearProperty(String key);

    private static void checkKey(String key);

通过System提供的properties,可以获取系统相关的信息,比如操作系统型号和版本、java版本、用户的工作目录等等;如下:

        public static void main(String[] args) {
		//获取系统的properties
		Properties properties = System.getProperties();
		//遍历所有属性
		for (Object key : properties.keySet()) {
			System.out.println(key + " = " + properties.getProperty(key.toString()));
		}
		//获取java版本号
		System.out.println(System.getProperty("java.version"));
	}

 

三、系统属性列表

序号属性描述
1awt.toolkitToolkit 的子类的类名
2file.encoding默认文件编码
3file.encoding.pkg文件编码所在包
4file.separator文件分隔符(在 UNIX 系统中是“/”)
5gopherProxySet 
6java.awt.graphicsenv系统相关的图形环境类
7java.awt.printerjob系统相关的打印类
8java.class.pathjava类路径,以“;”分割
9java.class.versionJava类版本号
10java.endorsed.dirs升级包替换目录(自定义jar包放入此目录可以代替系统jar包)
11java.ext.dirs可扩展的类路径,以“;”分割
12java.homejre根路径
13java.io.tmpdir计算机当前用户存放临时文件所在的目录
14java.library.path所有类库(jar)加载路径,用;”分割
15java.runtime.name运行时刻名称
16java.runtime.versionJava运行时的版本号
17java.specification.namejava规范运营商
18java.specification.vendorJava规范供应商
19java.specification.versionJava运行时环境规范版本
20java.vendorJava供应商
21java.vendor.urlJava供应商网址
22java.vendor.url.bugJava bug提交网址
23java.versionJava的版本号
24java.vm.info虚拟机信息
25java.vm.name虚拟机名字
26java.vm.specification.nameJava虚拟机规范名称
27java.vm.specification.vendorJava虚拟机规范供应商
28java.vm.specification.versionJava虚拟机规范版本
29java.vm.vendorJava虚拟机供应商
30java.vm.versionJava虚拟机版本
31line.separator行结束符(unix 为‘\n’,windows为‘\r\n’)
32os.arch 操作系统架构
33os.name操作系统名称
34os.version 操作系统版本
35path.separator系统环境变量路径分隔符(一般为‘;’)
36sun.arch.data.modelJava运行时的数据位数
37sun.boot.class.path 
38sun.boot.library.pathjre的bin路径
39sun.cpu.endianCPU字节类型
40sun.cpu.isalist CPU信息
41sun.io.unicode.encodingIO流编码
42sun.java.command正在执行的类
43sun.java.launcherJava启动器
44sun.jnu.encoding本地编码,新建文件用此编码
45sun.management.compiler编译器
46sun.os.patch.level Java补丁包
47user.country当前用户的国家编码
48user.country.format  
49user.dir 当前程序根目录
50user.home当前用户的根目录,如/home/ubuntu/
51user.language计算机当前的语言编码
52user.name当前用户名
53user.timezone算机当前所在时区

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值