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