当前位置: 首页 > news >正文

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、替代弃用方法

  1. 使用 Instant.now() 替代 System.currentTimeMillis()

  2. 使用 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
架构: amd64

Java 版本信息:
Feature: 17
Interim: 0
Update: 5
Patch: 0
LTS: true

相关文章:

  • 信誉好的江苏网站建设百度seo可能消失
  • 网站不能访问的原因百度爱采购优化
  • 东莞网站的制作设计百度安装应用
  • it运维有前途吗合肥seo报价
  • 怎么做网站的学校的大图培训机构网站设计
  • 招聘网站建设的目的郴州网站建设
  • 【150】基于SSM+Vue实现的小说阅读小程序(有文档)
  • 神经网络的本质 逻辑回归 python的动态展示
  • flutter的dart:async 异步 、dart:math 数学 、dart:convert 转换、dart:io、JavaScript 互作性
  • contOS7安装docker命令及yum源更换为国内源
  • bmc TrueSight 监控mysql配置
  • Nginx Web服务
  • wpf单文件打包还有 一些dll打包不进去?
  • 【GNSS原理】【多频组合】Chapter.8 GNSS定位算法——多频测量值的组合 [2025年6月]
  • Python打卡:Day35
  • kotlin中什么是Lambda 闭包
  • 《AI大模型核心技术揭秘与商业落地实战》学习内容系统总结
  • 利用大型语言模型增强边缘云 AI 系统安全性
  • windows系统中docker数据迁移出系统盘
  • vue2项目中配置切换不同的环境
  • 数字化项目调研过程中需要的文章
  • 《美化生活》投稿简介
  • 【微软认证系列】MB-910考试经验分享及详细介绍
  • 链表的排序算法
  • 医学数据分析实战:冠心病发病因素可视化
  • RGB相机 vs 灰度相机