在 Java 里,系统属性代表着 Java 虚拟机(JVM)运行时的一些配置信息与环境信息。这些属性以键值对形式存在,键和值均为字符串。你可以借助系统属性来获取有关操作系统、Java 运行环境、用户信息等内容。
除此以外,用户还可以自定义到属性信息。但是,Java 虚拟机一旦关闭再启动就找不到自定义到属性了,如果要永久记录用户自定义到属性,则可以采用 Properties 类到 load()/store() 方法进行属性的导入/导出操作,即将属性信息写入到文件中和从文件中读取自定义属性信息,以实现信息到持久化存储。
Java 虚拟机(JVM)内置了许多系统属性,这些属性提供了关于 JVM 运行环境、操作系统、Java 版本等多方面的信息。下面是 JVM 内置的系统属性信息:
java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商 URL java.home Java 安装目录 java.vm.specification.version Java 虚拟机规范版本 java.specification.maintenance.version Java 运行时环境规范维护版本,可解释为正整数(可选,见下文)。 java.vm.specification.vendor Java 虚拟机规范供应商 java.vm.specification.name Java 虚拟机规范名称 java.vm.version Java 虚拟机实现版本 java.vm.vendor Java 虚拟机实现供应商 java.vm.name Java 虚拟机实现名称 java.specification.version Java 运行时环境规范版本 java.specification.vendor Java 运行时环境规范供应商 java.specification.name Java 运行时环境规范名称 java.class.version Java 类格式版本号 java.class.path Java 类路径 java.library.path 加载库时要搜索的路径列表 java.io.tmpdir 默认临时文件路径 java.compiler 要使用的即时(JIT)编译器的名称 java.ext.dirs 扩展目录的路径或多个路径。已弃用。此属性及其实现机制可能在未来的版本中被移除。 os.name 操作系统名称 os.arch 操作系统架构 os.version 操作系统版本 file.separator 文件分隔符(在 UNIX 系统上为“/”) path.separator 路径分隔符(在 UNIX 系统上为“:”) line.separator 行分隔符(在 UNIX 系统上为“\n”) user.name 用户的账户名称 user.home 用户的主目录 user.dir 用户的当前工作目录
Java 提供了 System 类来操作系统属性。System 类里有两个常用的方法用于获取系统属性:
System.getProperty(String key) 依据键获取对应的系统属性值,若键不存在则返回 null。
System.getProperties() 获取包含所有系统属性的 Properties 对象。
简单示例:
package com.hxstrive.java_io; public class SystemPropertiesExample { public static void main(String[] args) { // 获取操作系统名称 String osName = System.getProperty("os.name"); System.out.println("操作系统名称: " + osName); // 获取 Java 版本 String javaVersion = System.getProperty("java.version"); System.out.println("Java 版本: " + javaVersion); // 获取用户的主目录 String userHome = System.getProperty("user.home"); System.out.println("用户主目录: " + userHome); // 获取当前工作目录 String workingDirectory = System.getProperty("user.dir"); System.out.println("当前工作目录: " + workingDirectory); // 获取所有系统属性 java.util.Properties properties = System.getProperties(); properties.list(System.out); } }
运行结果:
操作系统名称: Windows 8.1 Java 版本: 1.8.0_45 用户主目录: C:\Users\hxstr 当前工作目录: E:\work_demo -- listing properties -- java.runtime.name=Java(TM) SE Runtime Environment sun.boot.library.path=D:\ProgramFilesFree\Java\jdk1.8.0_45\... ... sun.desktop=windows sun.cpu.isalist=amd64
在 Java 中,你可以使用 System.setProperty(String key, String value) 方法来设置系统属性。示例如下:
package com.hxstrive.java_io; public class SystemPropertySetExample { public static void main(String[] args) { // 设置自定义系统属性 System.setProperty("my.custom.property", "custom value"); // 获取自定义系统属性 String customValue = System.getProperty("my.custom.property"); System.out.println("自定义系统属性值: " + customValue); } }
运行结果:
自定义系统属性值: custom value
除了在代码里设置系统属性,还能在命令行运行 Java 程序时设置系统属性。使用 -D 选项,后面跟上 key=value 形式的参数。示例如下:
java -Dmy.custom.property="value from command line" SystemPropertiesExample
在这个例子中,my.custom.property 这个系统属性会在运行 SystemPropertiesExample 程序时被设置为 "value from command line"。
注意:
系统属性是全局的,一旦设置,整个 JVM 进程都能访问。
部分系统属性是只读的,不能通过 System.setProperty 方法修改。
要避免在代码中硬编码系统属性的键,因为这些键可能会因不同的 Java 实现或者操作系统而有所不同。
Properties 类属于 java.util 包,它继承自 Hashtable<Object,Object>,主要用于处理属性文件。属性文件一般以 .properties 作为扩展名,其内容是键值对,键和值均为字符串。例如:
Properties 常见方法如下:
setProperty(String key, String value) 添加或修改属性。
getProperty(String key) 依据键获取属性值,若键不存在则返回 null。
getProperty(String key, String defaultValue) 依据键获取属性值,若键不存在则返回默认值。
load(InputStream inStream) 从输入流加载属性。
store(OutputStream out, String comments) 将属性保存到输出流,并添加注释。
如果要使用 Properties ,需要先创建 Properties 对象。它可以通过以下方式创建 Properties 对象:
package com.hxstrive.java_io; import java.util.Properties; public class PropertiesExample { public static void main(String[] args) { Properties properties = new Properties(); } }
你能使用 setProperty 方法添加属性,使用 getProperty 方法获取属性。示例如下:
package com.hxstrive.java_io; import java.util.Properties; public class Properties2Example { public static void main(String[] args) { Properties properties = new Properties(); // 添加属性 properties.setProperty("database.url", "jdbc:mysql://localhost:3306/mydb"); properties.setProperty("database.username", "root"); properties.setProperty("database.password", "password"); // 获取属性 String url = properties.getProperty("database.url"); String username = properties.getProperty("database.username"); String password = properties.getProperty("database.password"); System.out.println("URL: " + url); System.out.println("Username: " + username); System.out.println("Password: " + password); } }
运行结果:
URL: jdbc:mysql://localhost:3306/mydb Username: root Password: password
可使用 load 方法从属性文件加载属性。示例如下:
package com.hxstrive.java_io; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class PropertiesLoadExample { public static void main(String[] args) { Properties properties = new Properties(); try (InputStream input = ClassLoader.getSystemResourceAsStream("config.properties")) { // 从文件加载属性 properties.load(input); // 获取属性 String url = properties.getProperty("database.url"); String username = properties.getProperty("database.username"); String password = properties.getProperty("database.password"); System.out.println("URL: " + url); System.out.println("Username: " + username); System.out.println("Password: " + password); } catch (IOException e) { e.printStackTrace(); } } }
属性文件 config.properties 内容如下:
运行结果:
URL: jdbc:mysql://localhost:3306/mydb Username: root Password: password
使用 store() 方法可将属性保存到文件。示例如下:
package com.hxstrive.java_io; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; public class Properties3Example { public static void main(String[] args) { Properties properties = new Properties(); properties.setProperty("database.url", "jdbc:mysql://localhost:3306/mydb"); properties.setProperty("database.username", "root"); properties.setProperty("database.password", "password"); try (FileOutputStream fos = new FileOutputStream("config.properties")) { // 将属性保存到文件 properties.store(fos, "Database configuration"); } catch (IOException e) { e.printStackTrace(); } } }
运行结果:
通过上述内容,你已经了解 Properties 类的基本使用方法,从而在 Java 程序中方便地处理属性文件。