0

0

Java中的System类核心功能说明_获取环境变量、属性与系统拷贝

P粉602998670

P粉602998670

发布时间:2026-02-17 00:42:58

|

233人浏览过

|

来源于php中文网

原创

优先使用 system.getenv("key") 安全读取环境变量,避免 system.getenv().get();需判空处理,注意跨平台大小写差异;system.getproperty() 读取 jvm 参数而非系统环境变量。

java中的system类核心功能说明_获取环境变量、属性与系统拷贝

怎么安全读取系统环境变量(比如 PWDHOME

直接调用 System.getenv(String) 是最常用方式,但它返回的是只读快照——进程启动时的环境值,后续外部修改不会反映进来。如果业务依赖实时环境(比如热更新配置路径),这里会出问题。

常见错误是写成 System.getenv().get("PATH"),看似拿到全部再取值,但 System.getenv() 返回的是不可变 Map,且在某些 JDK 版本(如 Java 9+ 模块化后)可能抛 SecurityException(尤其 Web 容器里)。

  • 优先用带参数的 System.getenv("HOME"),它比遍历整个 map 更快、更安全
  • 不要假设环境变量一定存在:空值很常见,必须判空,比如 Objects.requireNonNullElse(System.getenv("TMPDIR"), "/tmp")
  • Windows 下变量名不区分大小写,Linux/macOS 区分——跨平台代码别硬写 "path",用 "PATH"

System.getProperty() 和环境变量到底啥区别

System.getProperty() 读的是 JVM 启动参数(-Dkey=value)或内置系统属性(如 os.name),和操作系统环境变量完全隔离。很多人混淆这两者,结果在 Docker 里传了 ENV TZ=Asia/Shanghai 却用 System.getProperty("TZ") 去取,当然为空。

  • 典型可读属性:"java.version""user.home""file.separator"——这些是 JDK 自带的,无需设置
  • 自定义属性必须显式加 -D:启动命令写 java -Dapp.env=prod MyApp,才能用 System.getProperty("app.env")
  • 注意 user.dir 是进程启动目录,不是 System.getProperty("user.home") ——后者才是用户主目录

为什么 System.arraycopy() 比 for 循环快,但又不能乱用

System.arraycopy() 是 JVM 底层直接调用内存拷贝指令(类似 C 的 memcpy),绕过 Java 数组边界检查和元素复制逻辑,所以大批量数组拷贝时性能优势明显。但它不是万能的“加速器”。

Llama Coder
Llama Coder

Llama Coder 是一个AI驱动的代码生成工具,可以一键生成完整的应用程序

下载

立即学习Java免费学习笔记(深入)”;

  • 源数组和目标数组必须类型兼容,否则抛 ArrayStoreException;基本类型数组之间不能混用(int[] 不能拷到 long[]
  • 目标数组必须已初始化且足够长,否则抛 IndexOutOfBoundsException——它不会自动扩容
  • 小数组(比如长度 arraycopy 有 JNI 调用成本
  • 多维数组只拷第一层引用,不是深拷贝:int[][] src = {{1}}; 拷过去后,修改 dst[0][0] 会影响 src[0][0]

System 类里哪些操作是线程不安全的

System 类本身是 final 工具类,但它的部分方法行为受外部状态影响,容易引发并发问题。最典型的是 System.setSecurityManager()(已废弃)和 System.setOut()/System.setErr()

  • System.setOut() 全局替换 stdout,多个线程同时调用会导致输出混乱,且无法回滚——生产环境绝对禁止动态改
  • System.currentTimeMillis()System.nanoTime() 本身线程安全,但若用它们做时间差计算(比如测耗时),要注意 nanoTime() 不保证单调性(某些旧 CPU 会有回跳)
  • 所有 System.setProperty() 操作都是全局生效,且没有原子性保障:两个线程同时 set 同一个 key,结果取决于执行顺序

真正麻烦的是,这些方法看起来“只是读个值”,但实际牵扯 JVM 全局状态。一旦在框架底层(比如日志组件)偷偷调了 setOut,上层应用就很难排查输出丢失的问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

750

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

750

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

569

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

234

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

209

2025.08.29

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.11.17

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

283

2026.02.13

热门下载

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

精品课程

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

共23课时 | 3.6万人学习

C# 教程
C# 教程

共94课时 | 9.5万人学习

Java 教程
Java 教程

共578课时 | 66.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号