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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86231.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入探究Manticoresearch Java API:新增与查询文档实战

引言Java 项目集成 Manticoresearch新增文档操作查询文档操作 SQL 查询API 查询 总结 引言 Manticore Search 是一个使用 C 开发的高性能搜索引擎&#xff0c;创建于 2017 年&#xff0c;其前身是 Sphinx Search。它显著改进了 Sphinx 的功能&#xff0c;修复了数百个错误&am…

Linux远程机器无法连接-------解决方案

笔者这几天碰到linux机器远程ssh 无法连接的情况 背景分析 笔者在linux机器进行测试的时候&#xff0c;偶发突然无法连接机器&#xff0c;如下图所示&#xff0c;vscode的远程连接也无法进行。 telnet也无法登录。 解决方案 笔者的登录场景是这样的&#xff0c;所以怀疑是…

网络模型中,应用层支持什么协议

在网络模型中&#xff08;无论是 OSI 七层模型 还是 TCP/IP 四层模型&#xff09;&#xff0c;应用层 是最顶层&#xff0c;直接为用户或应用程序提供网络服务接口。它支持的是各种具体的应用程序协议&#xff0c;这些协议定义了特定类型应用程序如何进行通信和数据交换。 以下…

比特币序数理论与铭文的终极指南

引言&#xff1a;比特币网络的意外趋势 去年&#xff0c;比特币网络上出现了一个意外的趋势——这一趋势令许多比特币纯粹主义者感到愤怒和惊讶&#xff0c;但同时也在更广泛的加密货币社区中点燃了对这个行业最古老、最安全区块链的希望和热情。 这个趋势涉及铭文&#xff0…

C/C++ DLL 动态链接库的开发与示例详解

简介 介绍 QT6&#xff0c;DLL 动态链接库的开发&#xff0c;开发示例 详细 DLL 入口函数 DllMain 是每个 dll 的入口函数&#xff0c;可以写&#xff0c;也可以不写&#xff0c;不影响其他库函数运行。如果使用此函数需要包含头文件#include <objbase.h>。 BOOL WI…

在 CentOS 7 上基于 Docker 的 LNMP 部署 Hexo

时间起因是因为之前BLOG没有备份数据都丢失了,今天在和朋友聊天的时候讨论到到底使用Hexo还是用Halo?最后还是想熟悉下这两种博客的架设和部署方式,每次部署都有各种不同的问题,旨在提升自己的学习认知。以此有机会得到更多大佬们的指导~ 因为我是在 CentOS 7 服务器上使用…

《Go小技巧易错点100例》第三十六篇

本期分享&#xff1a; 1.使用gops获取正在运行的Go进程 2.将静态文件编译到Go程序中 3.Go语言通过多重赋值实现变量值交换 使用gops获取正在运行的Go进程 在 Go 语言开发中&#xff0c;进程诊断和性能分析是保障服务稳定性的关键环节。Google 开源的 gops [https://github.…

Idea新UI

轻松上手Idea新UI&#xff1a;开启高效编程新体验 在软件开发领域&#xff0c;IntelliJ IDEA一直以其强大的功能和出色的性能深受开发者喜爱。而其推出的new ui&#xff0c;更是为我们带来了全新的操作体验&#xff0c;进一步提升了开发效率。今天&#xff0c;就来详细讲讲如何…

QML\QtQuick\QtWidgets适合的场景及其优缺点

在Qt框架中&#xff0c;QML、QtQuick和QtWidgets是三种不同的UI开发技术&#xff0c;各有其适用场景和优缺点。以下是它们的对比分析&#xff1a; 1. QtWidgets 适用场景&#xff1a; 传统的桌面应用程序&#xff08;Windows/macOS/Linux&#xff09;。 需要复杂控件&#xf…

Spring Boot 2.x 项目搭建 (二)

因为Spring Boot 2.x 项目搭建 &#xff08;一&#xff09;访问 start.spring.io 或通过IDE&#xff08;如IntelliJ IDEA&#xff09;的Spring Initializr向导创建项目时&#xff0c;只能使用jdk17以上的版本&#xff0c;这里我需要兼容老项目需要JDK1.8&#xff0c;所以进行一…

Python 前端框架/工具合集

前言 Python 本身并不是为前端开发而设计的语言&#xff0c;但确实有一些 Python 框架可以“变相”地用于前端开发&#xff0c;比如生成 HTML、控制前端页面逻辑&#xff0c;甚至可以直接运行在浏览器中。 目标 本文将对常见的使用python实现的前端框架&#xff0c;先做一个…

Swagger 在 Spring Boot 中的详细使用指南

Swagger 是一个强大的 API 文档生成工具&#xff0c;在 Spring Boot 项目中主要通过 springdoc-openapi 库实现。下面我将详细讲解 Swagger 的配置、注解使用和高级功能。 一、基础配置 1. 添加依赖 在 pom.xml 中添加&#xff1a; xml 复制 下载 运行 <dependency&…

群晖如何开启及使用ssh:小白用户上手指南-家庭云计算专家

最近很多用户希望提供群晖下onlyoffice的安装服务,但是很多都是萌新小白,不知道怎么启用ssh和使用ssh客户端.这里提供简单的方法,统一答复: 重要的事情说3遍:一定不要自己发挥,全部按说明的来;一定要在内网环境用内网ip访问;不要用域名和端口号,谢谢各位萌新了!!! 一、ssh启用…

Ubuntu查看与切换显示管理器(已测试ubuntu20,ubuntu24)

一级标题 显示管理器是用户使用图形化的登录界面。 当用户成功输入用户名和密码后&#xff0c;即可开始使用图形化界面会话。gdm3和 lightdm 都是显示管理器。 它们提供了图形化登录并处理用户身份验证。 查看正在使用的显示管理器&#xff1a; cat /etc/X11/default-displa…

ROS 2 中 Astra Pro 相机与 YOLOv5 检测功能编译启动全记录

先记录大概主要流程&#xff0c;后期有时间了再完善细节以及附上截图 一、编译 Astra Pro 相机功能包 1. 清理并编译相机包 cd ~/Astra_ws rm -rf build/astra_camera install/astra_camera # 清理旧编译 colcon build --packages-select astra_camera --parallel-workers …

当实体类名和数据库表列名不一致时不能封装数据的解决办法

1. <resultMap> 是什么&#xff1f; 作用&#xff1a;<resultMap> 用来定义数据库表字段和Java实体类属性之间的对应关系。 为什么需要&#xff1f; 数据库字段通常用下划线命名&#xff08;如 brand_name&#xff09;&#xff0c;而Java类属性用驼峰命名&#…

window系统上labelImg的安装与使用

一、window上安装Anaconda 下载&#xff1a;https://repo.anaconda.com/archive/选择版本&#xff0c;此次选择的是Anaconda3-2025.06-0-Windows-x86_64.exe双击安装在 Windows 搜索栏中输入 Anaconda Prompt 并打开。 二、安装pyton3.8 wondow环境 在 Windows 搜索栏中输入…

SSE 流与普通 HTTP 响应的区别

1. 连接特性 特性普通 HTTP 响应SSE 流连接持续时间一次性&#xff0c;请求-响应后立即关闭持久连接&#xff0c;保持打开状态通信方向单向 (客户端→服务器→客户端)单向 (服务器→客户端)数据格式完整响应体流式文本数据 (text/event-stream) 2. 数据传输方式 普通 HTTP 响…

Proteus仿真51单片机控制L298N PWM电机调速

51单片机概述 51单片机是指Intel公司开发的MCS-51系列单片机及其兼容产品&#xff0c;是应用最广泛的8位单片机系列之一。其名称来源于该系列的第一款芯片8051。 主要特点&#xff1a; 8位CPU&#xff1a;处理数据宽度为8位 哈佛结构&#xff1a;程序存储器和数据存储器分开…

批量将exb文件转为pdf的实用工具

最近在工作中遇到了一个棘手的问题&#xff1a;需要将大量CAXA电子图板(.exb)格式的图纸文件转换为PDF格式以便于共享和查阅。手动一个个打开转换不仅效率低下&#xff0c;而且容易出错。于是&#xff0c;我决定开发一个批量转换工具来解决这个问题。 使用效果 在实际使用中&…