System
1.System简介
System
类是一个代表程序所在系统工具类,位于 java.lang
包下,其中封装了一些系统信息和操作。
2.System的成员
system
中包含了三个公开的类变量( static
修饰的成员变量又称为类变量 ) :
/*
* “标准”输入流。这个流已经打开并准备接收输入数据。通常,这个流对应于键盘输入或
* 主机环境/用户指定的另一个输入源。简单理解就是监听键盘的输入。
*/
public final static InputStream in;
/*
* “标准”输出流。该流已经打开并且准备接受输出数据。通常,此流对应于显示输出
* 或由主机环境/用户指定的另一个输出目标。简单点可以理解为用来在显示器上显示
* 输出的。
*/
public final static PrintStream out;
/*
* 类似 out,区别在于,此输出流用于显示错误信息或其他信息。
*/
public final static PrintStream err;
我们都知道 InputStream 是抽象类,因此不能直接实例化对象,in
的具体类型是 BufferedInputStream
,源码分析如下:
简单使用示例:
public static void main(String[] args) {
System.out.println("请输入一个数字:");
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
for (char c : input.toCharArray()) {
if(!Character.isDigit(c)){
System.err.println("你输入的不是纯数字");
return;
}
}
System.out.println("你输入的数字为:" + input);
}
测试:
请输入一个数字:
100
你输入的数字为:100
请输入一个数字:
10o
你输入的不是纯数字
3.System的常用方法
3.1.System.arrayCopy
数组拷贝,源码如下:
public static native void arraycopy( Object src, int srcPos,
Object dest, int destPos, int length);
从源数组 src
的 srcPos
位置开始,拷贝到目标数组 dest
,从目标数组的 destPos
位置开始,共拷贝 length
个: src ( [srcPos,srcPos + length] ) → dest ( [destPos,destPos + length ] ) ,其中如果超出数组的范围,就按数组下标的最大值计算。
3.2.System.currentTimeMillis
该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。
源码如下:
public static native long currentTimeMillis();
注意:返回值类型为 long 类型
3.3.getProperty
该方法的作用是获得系统中属性,具体的定义如下:
public static String getProperty(String key)
系统中常见的属性名以及属性的说明如下表所示:
属性名 | 属性说明 | 示例 |
---|---|---|
java.version | Java 运行时环境版本 | 1.8.0_121 |
java.home | JRE 主目录 | C:\java\jdk1.8\jre |
java.runtime.name | Java运行时环境名称 | Java™ SE Runtime Environment |
java.runtime.version | Java运行时环境版本 | 1.8.0_121-b13 |
java.vm.version | Java 虚拟机版本 | 25.121-b13 |
java.vm.vendor | Java 虚拟机供应商 | Oracle Corporation |
java.vm.name | Java 虚拟机名称 | Java HotSpot™ 64-Bit Server VM |
java.vm.info | Java 虚拟机信息 | mixed mode |
java.vendor.url | Java供应商链接 | http://java.oracle.com/ |
java.io.tmpdir | 本地临时目录 | C:\Users\Admin\AppData\Local\Temp\ |
java.library.path | path环境变量 | C:\java\jdk1.8\bin;C:\java\jdk1.8\jre\bin;… |
os.name | 操作系统的名称 | Windows 10 |
os.version | 操作系统的版本 | 10.0 |
os.arch | 操作系统的版本 | amd64 |
user.name | 用户的账户名称 | Admin |
user.home | 用户的主目录 | C:\Users\Admin |
user.dir | 用户的当前工作目录 | E:\Java_workspace |
user.country | 用户所属国家 | CN |
user.language | 用户使用的语言 | zh |
sun.boot.library.path | jre的bin路径 | C:\java\jdk1.8\jre\bin |
file.encoding | 文件编码格式 | UTF-8 |
file.separator | 文件夹分隔符 | \ |
3.4.exit
源码:
public static void exit(int status) {
Runtime.getRuntime().exit(status);
}
这个方法是用来结束当前正在运行中的java虚拟机。如果 status 是非零参数,那么表示是非正常退出。 而且,该方法永远不会正常返回 (官方解释)。 而且指的注意的是,此方法执行后,会终止正在运行的虚拟机,释放内存,其后的所有代码将不执行,可能有人会有疑问,就算退出虚拟机也是需要时间的,难道后面的代码一点都不会执行吗?是的一点都不会执行,可以理解为 return origin; 即返回到虚拟机启动之前的状态,所以,之后的一切代码都不会执行。
示例:
public static void main(String[] args) {
try {
System.out.println("before exit");
System.exit(0);
System.out.println("after exit");
} catch (Exception e) {
e.printStackTrace();
}finally {
System.out.println("finally");
}
}
这段程序最后只会输出 before exit 这一句话,而不会输出 after exit 和 finally 。这可能是唯一一个能够不执行 finally 块的情况了。
3.5.gc
源码:
public static void gc() {
Runtime.getRuntime().gc();
}
调用 gc 方法建议 Java 虚拟机将精力花在回收未使用的对象上,以便使当前占用的内存能够快速重用。当方法调用返回控件时,Java虚拟机已经尽最大努力从所有被丢弃的对象中回收空间。但是此方法只是对虚拟机的一个建议,而不能保证虚拟机会立即进行垃圾回收。
还有一些关于 system.gc()
的知识点
- system.gc 执行的是普通的 full gc,STS(stop the world)意味着暂停所有线程,效率低。
- system.gc 一般情况可以使用-XX:+DisableExplicitGC 禁用