SystemUtil
SystemUtil是Hutool中用于处理系统属性和环境变量的工具类,提供了安全、便捷的方式来获取和设置系统属性,封装了System.getProperty()和System.getenv()方法。
# 功能介绍
- 系统属性获取:安全获取系统属性,避免权限问题导致的异常
- 环境变量获取:支持获取环境变量
- 类型转换:提供不同类型属性值的获取方法(字符串、布尔值、整数、长整数)
- 常用路径获取:便捷获取用户目录、临时目录、工作目录等常用路径
- 系统属性设置:支持设置和清除系统属性
- ClassPath获取:获取Java ClassPath路径
- 安全模式:提供安静模式,忽略无权限问题
# 常量定义
| 常量名 | 描述 |
|---|---|
| HUTOOL_DATE_LENIENT | Hutool自定义系统属性:是否解析日期字符串采用严格模式 |
# 核心方法
# 1. 系统属性获取
# get(String, String)
取得系统属性,如果因为Java安全的限制而失败,则返回默认值。
// 获取系统属性,失败返回默认值
String javaVersion = SystemUtil.get("java.version", "unknown");
Console.log("Java版本:" + javaVersion);
// 获取环境变量,失败返回默认值
String path = SystemUtil.get("PATH", "");
Console.log("PATH环境变量:" + path);
# get(String)
获得System属性,首先尝试获取系统属性,失败则尝试获取环境变量。
// 获取系统属性
String osName = SystemUtil.get("os.name");
Console.log("操作系统名称:" + osName);
// 获取环境变量
String javaHome = SystemUtil.get("JAVA_HOME");
Console.log("JAVA_HOME:" + javaHome);
# getQuietly(String)
获得System属性,忽略无权限问题,安静模式不打印错误信息。
// 安静模式获取系统属性,避免权限问题导致的异常
String userName = SystemUtil.getQuietly("user.name");
Console.log("用户名:" + userName);
# 2. 类型转换获取
# getBoolean(String, boolean)
获得boolean类型值。
// 获取Hutool日期解析严格模式设置,默认值为true
boolean dateLenient = SystemUtil.getBoolean(SystemUtil.HUTOOL_DATE_LENIENT, true);
Console.log("Hutool日期解析严格模式:" + dateLenient);
# getInt(String, int)
获得int类型值。
// 获取Java虚拟机最大内存(MB),默认值为256MB
int maxMemory = SystemUtil.getInt("sun.arch.data.model", 256);
Console.log("Java虚拟机数据模型:" + maxMemory + "位");
# getLong(String, long)
获得long类型值。
// 获取系统时间戳(毫秒),默认值为当前时间
long currentTime = SystemUtil.getLong("current.time", System.currentTimeMillis());
Console.log("当前时间:" + currentTime);
# 3. 系统属性操作
# getProps()
获取所有系统属性。
// 获取所有系统属性
Properties props = SystemUtil.getProps();
// 遍历并打印系统属性
props.forEach((key, value) -> {
Console.log(key + ": " + value);
});
# set(String, String)
设置系统属性,value为null表示移除此属性。
// 设置Hutool日期解析严格模式
SystemUtil.set(SystemUtil.HUTOOL_DATE_LENIENT, "false");
// 移除系统属性
SystemUtil.set("custom.property", null);
# 4. 常用路径获取
# getJavaClassPaths()
获得Java ClassPath路径,不包括jre。
// 获取Java ClassPath路径
String[] classPaths = SystemUtil.getJavaClassPaths();
Console.log("Java ClassPath路径:");
for (String path : classPaths) {
Console.log(" " + path);
}
# getUserHomePath()
获取用户路径(绝对路径)。
// 获取用户路径
String userHome = SystemUtil.getUserHomePath();
Console.log("用户路径:" + userHome);
# getTmpDirPath()
获取临时文件路径(绝对路径)。
// 获取临时文件路径
String tmpDir = SystemUtil.getTmpDirPath();
Console.log("临时文件路径:" + tmpDir);
# getUserDirPath()
获取工作目录路径(绝对路径)。
// 获取工作目录路径
String userDir = SystemUtil.getUserDirPath();
Console.log("工作目录路径:" + userDir);
# 应用场景
# 1. 安全获取系统属性
在Java安全沙箱环境中,获取某些系统属性可能会抛出SecurityException。使用SystemUtil可以安全地获取系统属性:
// 传统方式可能抛出SecurityException
String osName;
try {
osName = System.getProperty("os.name");
} catch (SecurityException e) {
osName = "unknown";
}
// 使用SystemUtil,安全获取
String osName = SystemUtil.get("os.name", "unknown");
# 2. 环境变量获取
在需要获取环境变量时,可以使用SystemUtil:
// 获取数据库连接信息
String dbHost = SystemUtil.get("DB_HOST", "localhost");
String dbPort = SystemUtil.get("DB_PORT", "3306");
String dbUser = SystemUtil.get("DB_USER", "root");
String dbPass = SystemUtil.get("DB_PASS", "");
// 构建数据库连接URL
String url = String.format("jdbc:mysql://%s:%s/mydb", dbHost, dbPort);
# 3. 配置管理
在应用程序中,可以使用系统属性来管理配置:
// 获取应用程序配置
String appName = SystemUtil.get("app.name", "MyApp");
String appVersion = SystemUtil.get("app.version", "1.0.0");
boolean debugMode = SystemUtil.getBoolean("app.debug", false);
int maxThreads = SystemUtil.getInt("app.max.threads", RuntimeUtil.getProcessorCount());
// 初始化应用程序
AppConfig config = new AppConfig();
config.setName(appName);
config.setVersion(appVersion);
config.setDebugMode(debugMode);
config.setMaxThreads(maxThreads);
# 4. 路径管理
在需要使用系统路径时,可以使用SystemUtil提供的便捷方法:
// 获取临时文件路径,用于存储临时数据
String tmpPath = SystemUtil.getTmpDirPath();
File tmpFile = new File(tmpPath, "temp_data.txt");
// 获取用户目录,用于存储用户配置
String userHome = SystemUtil.getUserHomePath();
File configFile = new File(userHome, ".myapp/config.properties");
// 获取工作目录,用于处理相对路径
String userDir = SystemUtil.getUserDirPath();
File dataFile = new File(userDir, "data/file.txt");
# 5. 动态配置
在应用程序运行时,可以动态设置系统属性:
// 动态设置日志级别
SystemUtil.set("logging.level.root", "DEBUG");
// 动态设置Hutool日期解析严格模式
SystemUtil.set(SystemUtil.HUTOOL_DATE_LENIENT, "true");
// 移除不需要的系统属性
SystemUtil.set("temp.property", null);
# 注意事项
- 属性优先级:
SystemUtil.get()方法首先尝试获取系统属性,失败则尝试获取环境变量。 - 权限问题:在某些安全环境中,获取系统属性或环境变量可能会抛出SecurityException。使用
getQuietly()方法可以忽略这些异常。 - 类型转换:使用
getBoolean()、getInt()和getLong()方法时,会尝试将字符串值转换为对应的类型,如果转换失败则返回默认值。 - 系统属性修改:使用
set()方法修改系统属性时,修改的作用域仅限于当前JVM实例。 - 环境变量只读:
SystemUtil不提供修改环境变量的方法,因为环境变量是由操作系统管理的,JVM只能读取,不能修改。 - 性能考虑:频繁获取系统属性可能会影响性能,建议将经常使用的系统属性缓存起来。
# 总结
SystemUtil是一个功能强大的系统属性工具类,提供了安全、便捷的方式来获取和设置系统属性。无论是获取系统信息、管理应用配置还是处理系统路径,SystemUtil都能提供简洁高效的解决方案。在Java开发中,合理使用SystemUtil可以简化代码,提高应用程序的安全性和可维护性。