JDK源码之System
基本概念
System 类是一个位于java.lang
包下的核心工具类,提供了多种与系统相关的实用方法和字段。这个类的特殊之处在于它不能被实例化,其构造方法是私有的,所有成员(字段和方法)都是静态的,因此可以通过类名直接调用。
System 类的主要作用是为 Java 程序提供与运行时环境交互的能力,包括标准输入输出、系统属性访问、环境变量读取、时间获取、数组操作等。是 Java 中常用的系统级工具集。
System 中的大多数方法都是线程安全的,因为它们使用静态同步方法或内部同步机制,但是需要注意标准流混合输出会出现交错的情况,设置和获取系统属性时要注意线程之间的可见性
主要静态字段
// 标准输入流,默认对应键盘输入
public final static InputStream in = null;
// 标准输出流,默认向控制台输出信息
public final static PrintStream out = null;
// 标准错误流,用于输出错误信息,与标准输出分开便于识别处理
public final static PrintStream err = null;
使用方法简单示例
public class Test {public static void main(String[] args) {// 使用System.in接收输入Scanner scanner = new Scanner(System.in);System.out.println("请输入内容:");String s = scanner.nextLine();// 使用System.out正常输出System.out.println("你输入了:" + s);// 使用System.err输出错误信息if (s.trim().isEmpty()) {System.err.println("错误,不能输入空");}}
}
常用方法
重定向标准流的方法
System 类提供了重定向这些标准流字段的方法,在日志记录和系统调试中非常有用
// 重新分配标准输入流
public static void setIn(InputStream in) {checkIO();setIn0(in);
}
// 重新分配标准输出流
public static void setOut(PrintStream out) {checkIO();setOut0(out);
}
// 重新分配标准错误输出流
public static void setErr(PrintStream err) {checkIO();setErr0(err);
}
时间获取方法
currentTimeMillis用于返回当前时间与 UTC 1970 年 1 月 1 日午夜的时间差,单位为毫秒,主要用于日常时间记录、代码性能监控。nanoTime 用于返回 JVM 高精度时间源,单位是纳秒,主要用于高精度性能测试、算法效率测量。这两个方法都是 native 方法
public static native long currentTimeMillis();
public static native long nanoTime();
数组复制方法
主要用于高效复制数组元素,使用 native 实现
参数:
- src:源数组
- srcPos:源数组起始位置
- dest:目标数组
- destPos:目标数组起始位置
- length:复制元素数量
public static native void arraycopy(Object src, int srcPos,Object dest, int destPos,int length);
环境变量和系统属性
// 获取环境变量
// 获取所有环境变量
public static java.util.Map<String,String> getenv() {SecurityManager sm = getSecurityManager();if (sm != null) {sm.checkPermission(new RuntimePermission("getenv.*"));}return ProcessEnvironment.getenv();
}
// 获取指定环境变量
public static String getenv(String name) {SecurityManager sm = getSecurityManager();if (sm != null) {sm.checkPermission(new RuntimePermission("getenv."+name));}return ProcessEnvironment.getenv(name);
}
// 获取所有系统属性
public static Properties getProperties() {SecurityManager sm = getSecurityManager();if (sm != null) {sm.checkPropertiesAccess();}return props;
}
// 获取指定的系统属性
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);
}
// 设置系统属性
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);
}
程序退出方法
用于终止当前运行的 JVM,status 为退出状态码,0 表示正常退出,非零表示异常退出。一般是命令行工具、服务器应用启动脚本会使用
public static void exit(int status) {Runtime.getRuntime().exit(status);
}
垃圾回收方法
gc作用是建议 JVM 进行垃圾回收,这里只是建议,JVM 不一定执行。runFinalization 作用是运行对象终结方法
public static void gc() {Runtime.getRuntime().gc();
}
public static void runFinalization() {Runtime.getRuntime().runFinalization();
}
其他实用方法
lineSeparator 用于返回当前系统的行分隔符,Windows 返回\r\n
,Linux 或 MAC 返回\n
。identityHashCode 用于返回对象原始哈希码,无视 hashCode 重写
public static String lineSeparator() {return lineSeparator;
}
public static native int identityHashCode(Object x);