Java常用系统工具类库与System

风雪小哥_9339

风雪小哥_9339

2026-01-07

949人浏览

原创

高精度计时应选System.nanoTime();它提供纳秒级单调时间,不受系统时钟调整影响,适合性能压测和算法耗时对比,而System.currentTimeMillis()仅适用于表示当前时刻,精度低且易受NTP同步干扰。

java常用系统工具类库与system

System.currentTimeMillis() 和 System.nanoTime() 怎么选

需要高精度计时(比如性能压测、算法耗时对比)时,System.nanoTime() 是唯一可靠选择;System.currentTimeMillis() 只适合表示“当前时刻”(如日志时间戳、缓存过期计算),它受系统时钟调整影响,可能回拨或跳变。

常见错误是用 currentTimeMillis() 做短于 10ms 的耗时统计,结果出现负数或忽大忽小——因为它的底层依赖系统时钟,精度通常只有 10–15ms(Windows)或 1–10ms(Linux),且会被 NTP 同步干扰。

  • System.nanoTime() 返回纳秒级单调递增值,不受系统时钟修改影响,但不表示真实时间,不能和日期类互转
  • 两次 nanoTime() 相减得到的是纳秒差,除以 1_000_000 得毫秒,注意别直接除 1000(那是微秒)
  • 不要用 nanoTime() 存储或跨 JVM 传递,它没有全局意义,只在单次运行内有效

System.getProperty() 常用键名与陷阱

读取 JVM 启动参数或环境信息最常用的方式,但很多键名不是标准定义,不同 JDK 版本/厂商行为不一致。关键要区分哪些是规范保证的,哪些是“大家习惯这么用但没写进 spec”。

以下键名在 OpenJDK、Oracle JDK、Zulu 等主流实现中基本可用:

  • java.version:JDK 主版本号(如 "17.0.1")
  • os.name:操作系统名称("Linux"、"Windows 10"、"Mac OS X")
  • user.home:当前用户主目录路径("/home/xxx" 或 "C:\Users\xxx")
  • file.separator:文件路径分隔符("/" 或 "\"),比硬写 "/" 更安全

容易踩的坑:

  • os.arch 返回值不可靠,OpenJDK 17 在 Apple M1 上返回 "aarch64",但某些旧工具链仍期望 "arm64"
  • java.io.tmpdir 路径末尾不带斜杠,拼接文件名时必须手动加 File.separator 或用 Path.of()
  • 自定义参数(如 -Dmy.config=prod)必须用 System.getProperty("my.config"),不能漏掉前缀 "my."

System.setSecurityManager() 已被移除,替代方案是什么

从 JDK 17 开始,System.setSecurityManager() 被彻底移除(JEP 411),调用会抛出 UnsupportedOperationException。这不是临时禁用,而是永久删除——因为 Security Manager 设计复杂、性能差、实际拦截能力弱,且现代容器/云环境已用更细粒度的隔离机制替代。

windows-auto
windows-auto

Windows 桌面自动化技能,支持鼠标控制(移动/点击/拖拽/滚轮/截图)、键盘输入(文字输入/按键/组合键)、窗口管理(查找/聚焦/最大化/最小化/关闭/移动)、截图并发送文件。提供两种截图方式:Python pyautogui 截图(集成在自动化流程中)和 PowerShell + .NET 零依赖截图(支持区域截图和多显示器)。当用户需要自动化 Windows 桌面操作、控制鼠标键盘、管理窗口、执行 GUI 自动化任务、截图发送文件时使用。

下载

如果你的代码还在调用它(比如老项目升级到 JDK 17+),必须改写:

  • 日志、配置、网络访问等敏感操作,改用显式权限检查 + 自定义策略(如 Spring Security 的 @PreAuthorize、Shiro 的 Subject.isPermitted())
  • 禁止反射调用私有方法?用模块系统(module-info.java)控制包导出,或运行时用 Method.setAccessible(false) 配合安全管理器遗留逻辑(仅限 JDK 16 及以前)
  • 沙箱执行第三方脚本?改用独立进程(ProcessBuilder)+ 资源限制(cgroups / Docker),或嵌入 GraalVM 的 Context 沙箱

注意:JDK 17 的 java.security.manager 系统属性已无效,启动加 -Djava.security.manager=allow 不起作用。

Arrays、Objects、Objects.requireNonNull() 这些“工具类”和 System 有什么关系

它们不属于 System 类,但常被误认为是“系统级工具”,其实都是 java.util 包下的普通工具类,和 System 没继承或依赖关系。真正和 System 强相关的只有 System.out、System.in、System.err 这三个静态字段。

容易混淆的点:

  • Objects.requireNonNull() 是空指针防护工具,但它不读系统属性、不触发 GC、不调用 native 方法——它只是个纯 Java 方法,性能开销极小
  • Arrays.toString() 和 System.out.println() 经常一起用,但前者不依赖后者;你可以把数组字符串存到文件或发 HTTP 请求,完全绕过 System.out
  • System.gc() 是建议 JVM 执行 GC,但不保证立即执行;而 Runtime.getRuntime().gc() 效果相同,两者无实质区别,都不该在生产代码中主动调用
String[] arr = {"a", "b", "c"};
System.out.println(Arrays.toString(arr)); // 常见组合,但二者解耦
// 等价于:
String s = Arrays.toString(arr);
System.out.println(s); // 显式拆开,更清楚职责

真正需要警惕的是把 System 当成“万能工具箱”——它只提供最底层、最不可替代的系统交互入口(时间、属性、IO 流、退出),其余都该交给专门的工具类或框架。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2791

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

497

25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1838

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2944

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6244

49

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

2023.11.24

6149

6

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

2024.03.22

7734

16

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

2024.04.29

11714

11

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

2025.07.29

6039

17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程