JDK 17 中 java.lang.System 常用方法及应用场景
概述
java.lang.System
在 JDK 17 中依然是最核心的系统交互类之一。以下是针对 JDK 17 的常用方法详解,包含新特性和最佳实践。
一、标准 I/O 流(更新至 JDK 17)
1. 控制台输出
// 传统输出方式(仍然可用)
System.out.println("Hello JDK 17");// 新增:使用文本块(Text Blocks,JDK 15 正式特性)
System.out.println("""This is a multi-linetext block in JDK 17.No more messy concatenation!""");
应用场景:日志输出、多行文本处理
2. 错误输出(新增格式化方法)
// JDK 17 增强的格式化错误输出
System.err.printf("Error at %s: %d%n", Instant.now(), errorCode);// 使用新的格式说明符
System.err.printf("Hex value: %#x %n", 255); // 输出: Hex value: 0xff
二、系统属性操作(JDK 17 安全增强)
1. 获取系统属性(新增过滤检查)
// 传统方式
String javaHome = System.getProperty("java.home");// JDK 17 更安全的属性读取(避免NPE)
String nonExistent = System.getProperty("non.existent.prop", "default-value");// 获取模块化相关信息(JDK 9+)
System.out.println("Module path: " + System.getProperty("jdk.module.path"));
2. 只读系统属性视图(JDK 17)
// 获取不可修改的系统属性视图
Map<String,String> props = System.getProperties();
try {props.put("new.key", "value"); // 抛出 UnsupportedOperationException
} catch (UnsupportedOperationException e) {System.err.println("系统属性是只读的!");
}
三、时间测量(JDK 17 新增时间API整合)
1. 高精度时间测量
// 传统方式
long start = System.nanoTime();
// ...操作...
long duration = System.nanoTime() - start;// JDK 17 推荐结合 java.time
Instant startInstant = Instant.now();
// ...操作...
Duration elapsed = Duration.between(startInstant, Instant.now());
System.out.printf("耗时: %d ms %n", elapsed.toMillis());
四、数组操作(JDK 17 优化)
1. 数组复制(新增安全检查)
// 传统数组复制
int[] src = IntStream.range(1, 6).toArray();
int[] dest = new int[5];
System.arraycopy(src, 0, dest, 0, 5);// JDK 17 更安全的替代方案(推荐)
int[] copy = Arrays.copyOf(src, src.length);
五、环境变量访问(JDK 17 安全改进)
1. 读取环境变量
// 传统方式
String path = System.getenv("PATH");// JDK 17 更安全的访问方式
Optional<String> javaHome = Optional.ofNullable(System.getenv("JAVA_HOME"));
javaHome.ifPresentOrElse(home -> System.out.println("Java Home: " + home),() -> System.err.println("JAVA_HOME 未设置")
);
六、新增实用方法(JDK 11+)
1. System.console()
增强
// JDK 17 更健壮的控制台交互
Console console = System.console();
if (console != null) {String input = console.readLine("请输入密码: ");char[] password = console.readPassword();Arrays.fill(password, ' '); // 安全清除
} else {System.err.println("无控制台环境");
}
2. System.Logger
(JDK 9+)
// 系统统一日志接口
System.Logger logger = System.getLogger("MyApp");
logger.log(System.Logger.Level.INFO, "JDK 17 系统日志");// 输出示例:
// 六月 24, 2023 10:00:00 上午 MyApp INFO: JDK 17 系统日志
七、进程处理(JDK 17 新增)
1. 进程句柄 API
// 获取当前进程信息(JDK 9+)
ProcessHandle current = ProcessHandle.current();
System.out.println("PID: " + current.pid());
System.out.println("CPU 使用: " + current.info().cpuDuration());// 列出所有进程(JDK 17 增强)
ProcessHandle.allProcesses().filter(p -> p.info().command().isPresent()).limit(5).forEach(p -> System.out.println(p.info().command().get()));
八、内存管理(JDK 17 改进)
1. 内存状态查询
// JDK 17 更精确的内存报告
Runtime runtime = Runtime.getRuntime();
System.out.printf("""内存使用情况:总内存: %d MB可用内存: %d MB最大内存: %d MB""",runtime.totalMemory() / (1024 * 1024),runtime.freeMemory() / (1024 * 1024),runtime.maxMemory() / (1024 * 1024)
);
最佳实践建议(JDK 17)
1、替代弃用方法
-
使用
Instant.now()
替代System.currentTimeMillis()
- 使用
Arrays.copyOf()
替代System.arraycopy()
简单场景
2、安全增强:
// 不推荐(可能暴露敏感信息)
System.getProperties().list(System.out);// 推荐方式(JDK 17)
Set<String> sensitiveKeys = Set.of("user.name", "user.home");
System.getProperties().entrySet().stream().filter(e -> !sensitiveKeys.contains(e.getKey())).forEach(e -> System.out.println(e.getKey() + "=" + e.getValue()));
3、模块化兼容:
// 检查模块系统
if (System.getProperty("jdk.module.main") != null) {System.out.println("运行在模块模式下");
}
完整示例:JDK 17 系统信息工具
public class SystemInfoTool {public static void main(String[] args) {printSystemInfo();checkJavaVersion();}private static void printSystemInfo() {String osInfo = """OS 信息:名称: %s版本: %s架构: %s""".formatted(System.getProperty("os.name"),System.getProperty("os.version"),System.getProperty("os.arch"));System.out.println(osInfo);}private static void checkJavaVersion() {Runtime.Version version = Runtime.version();System.out.printf("""Java 版本信息:Feature: %dInterim: %dUpdate: %dPatch: %dLTS: %b""",version.feature(),version.interim(),version.update(),version.patch(),version.feature() == 17 // JDK 17 是 LTS);}
}
输出示例:
OS 信息:
名称: Windows 10
版本: 10.0
架构: amd64Java 版本信息:
Feature: 17
Interim: 0
Update: 5
Patch: 0
LTS: true