Java 的Properties类(全限定名:java.util.Properties)本质上类似一个专门存储String 类型键值对的映射结构(它间接继承自Map)。该类的核心能力在于:既能将键值对写入磁盘上的.properties文件,也能从已有的.properties文件中读取键值对并加载。正因如此,Properties成为 Java 应用中存储简单配置属性(如数据库连接参数、应用基础设置等)的常用机制。
要使用 Java 的Properties类,首先需要创建该类的实例,这可以通过调用其构造函数并配合 Java 的 new关键字来完成。例如:
Properties properties = new Properties();
要在 Java 的 Properties 实例中设置属性,需使用 setProperty() 方法。例如:
Properties properties = new Properties(); properties.setProperty("email", "helen@gmail.com");
上面示例将键为 email 的属性设置为值 helen@gmail.com。
要从 Java 的 Properties 对象中获取属性值,需调用 getProperty () 方法,并将目标属性的键作为参数传入该方法。例如:
Properties properties = new Properties(); properties.setProperty("email", "helen@gmail.com"); // 获取 email 的值 String email = properties.getProperty("email"); System.out.println(email); //helen@gmail.com
你也可以使用 Properties 实例的 remove() 方法来移除其中的属性,只需将待移除属性的键作为参数传递给 remove() 方法即可。例如:
Properties properties = new Properties(); properties.setProperty("email", "helen@gmail.com"); // 移除 email 属性 Object removeResult = properties.remove("email"); System.out.println(removeResult); //helen@gmail.com
你可以通过 keySet() 获取 Properties 实例的键集,然后迭代该键集的方式,来遍历 Properties 实例中的所有键。例如:
Properties properties = new Properties(); properties.setProperty("email", "helen@gmail.com"); properties.setProperty("name", "helen"); properties.setProperty("id", "1000"); Iterator<Object> iterator = properties.keySet().iterator(); while (iterator.hasNext()) { String key = (String) iterator.next(); System.out.println(key + "=" + properties.getProperty(key)); }
此示例将打印出以下行:
name=helen id=1000 email=helen@gmail.com
你可以将属性键值对存储到属性文件中,之后还能再次读取该文件。这一存储操作可通过 Properties 对象的 store () 方法来实现,该方法能将对象中的内容写入到指定的属性文件中。例如:
Properties properties = new Properties(); properties.setProperty("email", "helen@gmail.com"); properties.setProperty("name", "helen"); properties.setProperty("id", "1000"); try(FileWriter output = new FileWriter("D:/me.properties")){ properties.store(output, "These are properties"); } catch (IOException e) { e.printStackTrace(); }
默认情况下,Java 属性文件的编码格式为 ISO-8859-1(即 Latin-1),但该编码仅支持有限字符集,无法很好地兼容中文等非拉丁字符。如今实际开发中,更常用 UTF-8 编码 来处理多语言场景。
若需指定文件编码存储属性,可在使用 FileWriter 时,通过其支持编码参数的构造方法(第二个参数传入编码名称)来明确设置,例如指定为 UTF-8 编码。例如:
Properties properties = new Properties(); properties.setProperty("email", "helen@gmail.com"); properties.setProperty("name", "helen"); properties.setProperty("id", "1000"); try(FileWriter output = new FileWriter("D:/me.properties", StandardCharsets.UTF_8)){ properties.store(output, "These are properties"); } catch (IOException e) { e.printStackTrace(); }
一个 Java Properties 属性文件由多行组成,每行包含一个 key=value 键值对。以下是一个 Java Properties 属性文件的示例:
#These are properties #Tue Sep 30 16:21:51 CST 2025 name=helen id=1000 email=helen@gmail.com
注意,以 # 开头的行是注释。属性文件的第一行实际上是调用 properties.store(文件, 说明信息) 方法的第二个参数。
可以通过 Properties 对象的 load() 方法,将存储在属性文件中的属性加载回该对象。例如:
Properties properties = new Properties(); try(FileReader reader = new FileReader("D:/me.properties")){ properties.load(reader); System.out.println(properties); //{name=helen, id=1000, email=helen@gmail.com} } catch (IOException e) { e.printStackTrace(); }
默认情况下,load() 方法会假定所加载的文件采用 ISO-8859-1(Latin-1)编码。如果你的属性文件使用其他编码,例如 UTF-8,则必须在用于加载属性文件的 FileReader 中将该编码指定为第二个参数。例如:
Properties properties = new Properties(); try(FileReader reader = new FileReader("D:/me.properties", StandardCharsets.UTF_8)){ properties.load(reader); System.out.println(properties); //{name=helen, id=1000, email=helen@gmail.com} } catch (IOException e) { e.printStackTrace(); }
Properties 类还可以通过其 storeToXML() 方法,将存储在其中的键值对写入 XML 文件。例如:
Properties properties = new Properties(); properties.setProperty("email", "helen@gmail.com"); properties.setProperty("name", "helen"); properties.setProperty("id", "1000"); try(FileOutputStream output = new FileOutputStream("D:/me.xml")){ properties.storeToXML(output, "Descriptive information"); } catch (IOException e) { e.printStackTrace(); }
运行结果:
默认情况下,Properties XML属性文件的编码是UTF-8。这与非XML属性文件的默认编码相反。如果需要为 XML 文件使用其他编码,也是可以的。你可以将所要使用的文件编码指定为 storeToXML 方法的第三个参数。以下是使用 ISO-8859-1 编码将 Properties 存储到XML的示例,例如:
Properties properties = new Properties(); properties.setProperty("email", "helen@gmail.com"); properties.setProperty("name", "helen"); properties.setProperty("id", "1000"); try(FileOutputStream output = new FileOutputStream("D:/me.xml")){ properties.storeToXML(output, "Descriptive information", StandardCharsets.ISO_8859_1); } catch (IOException e) { e.printStackTrace(); }
运行结果:
你可以通过 Properties 对象的 loadFromXML() 方法,从 XML 属性文件中加载属性。例如:
Properties properties = new Properties(); try(FileInputStream fileInputStream = new FileInputStream("D:/me.xml")){ properties.loadFromXML(fileInputStream); System.out.println(properties); //{name=helen, id=1000, email=helen@gmail.com} } catch(IOException e){ e.printStackTrace(); }
默认情况下,loadFromXML() 方法会假定 XML 文件采用 UTF-8 编码存储。请注意,这与非 XML 属性文件的默认编码情况相反。如果你的 XML 文件使用其他编码,例如 ISO-8859-1(Latin-1),那么你的XML文件必须在内部指定该编码。具体做法是,在XML属性文件的第一行包含以下内容:
<?xml version="1.0" encoding="ISO-8859-1"?>
可以将属性从类路径上的可用文件加载到 Properties 对象中。这里所说的 "类路径上的文件",既可以是与加载属性的应用程序位于同一个 JAR 文件中,也可以是在 Java 应用程序运行时,处于 Java 类路径上的其他 JAR 文件或目录中。
若要从类路径上的文件加载属性,首先需要获取一个 Class 实例。在下面的示例中,我将从包含应用程序 main () 方法的类中获取该实例:
Class aClass = PropertiesExample.class;
一旦我获得了 Class 实例,就可以调用它的 getResourceAsStream() 方法,该方法会返回一个引用该文件的 Java 输入流(Java InputStream)。例如:
Class<?> clazz = PropertiesDemo.class; InputStream inputStream = clazz.getResourceAsStream("/database.properties");
database.properties 文件必须位于类路径的根目录下。如下图:
如果将其放入子目录中,传递给 getResourceAsStream() 的路径应反映这一点,例如:/subdir/database.properties。
借助 InputStream,你可以使用 Properties 的 load() 或 loadFromXML() 方法,将文件加载到 Properties 实例中。例如:
Class<?> clazz = PropertiesDemo.class; Properties properties = new Properties(); try (InputStream inputStream = clazz.getResourceAsStream("/database.properties")) { properties.load(inputStream); Iterator<Object> iterator = properties.keySet().iterator(); while(iterator.hasNext()) { String key = (String) iterator.next(); System.out.println(key + "=" + properties.getProperty(key)); } } catch (Exception e) { e.printStackTrace(); }
运行结果:
db.pool.initialSize=5 db.password=123456 db.pool.validationQuery=SELECT 1 db.pool.maxIdle=10 db.pool.maxActive=20 db.pool.minEvictableIdleTimeMillis=300000 db.username=root db.url=jdbc:oracle:thin:@localhost:1521:orcl db.pool.minIdle=3 db.pool.maxWait=3000 db.pool.timeBetweenEvictionRunsMillis=60000 Process finished with exit code 0
Java 的 Properties 类支持为特定场景提供默认属性值 —— 即当 Properties 实例中未注册(不存在)某个目标属性键时,可返回预先设定的默认值。实现这一功能主要有以下两种方式:
为 getProperty() 方法提供一个默认值。
在创建新的 Properties 实例时,提供一个包含默认值的 Properties 实例。
getProperty() 方法有一个重载版本,它会接收一个额外参数 —— 当 Properties 实例中不包含给定键对应的值时,该参数将作为默认值返回。例如:
Properties properties = new Properties(); properties.setProperty("email", "helen@gmail.com"); properties.setProperty("name", "helen"); properties.setProperty("id", "1000"); String age = properties.getProperty("age", "20"); System.out.println(age); //20
注意,如果 Properties 实例不包含键为 age 的属性,那么将返回值 20,而不是返回 null —— 如果没有向getProperty() 传递默认值,就会返回 null。
Properties 类可以用另一个 Properties 实例来实例化,这个实例包含了默认值,当新创建的 Properties 实例不包含所请求的属性键的值时,就会使用这些默认值。例如:
Properties defaultProperties = new Properties(); defaultProperties.setProperty("age", "20"); Properties properties = new Properties(defaultProperties); properties.setProperty("email", "helen@gmail.com"); properties.setProperty("name", "helen"); properties.setProperty("id", "1000"); String age = properties.getProperty("age"); System.out.println(age); //20
注意,由于我们没有为 properties 实例中的 age 键设置任何属性值,所以 properties 实例会转而到 defaultProperties 中查找该值。
Java 中的“系统属性”对应一个特殊的 Properties 实例,该实例存储的是与当前运行环境相关的系统级属性 —— 这些属性本质上是 Java 虚拟机(JVM)、操作系统配置或应用运行上下文的关键设置(例如操作系统名称、JVM 版本、用户工作目录等)。若需访问这些系统属性,可通过 System.getProperties() 静态方法直接获取整个系统属性的 Properties 实例。例如:
Properties systemProperties = System.getProperties(); System.out.println("java.vm.name=" + systemProperties.getProperty("java.vm.name")); System.out.println("java.version=" + systemProperties.getProperty("java.version"));
运行结果:
java.vm.name=Java HotSpot(TM) 64-Bit Server VM java.version=17.0.12
System 类还拥有 getProperty() 和 setProperty() 方法,它们是 System Properties 实例的 Properties 类的 getProperty() 和 setProperty()方法的快捷方式。例如:
Properties systemProperties = System.getProperties(); System.out.println("java.vm.name=" + systemProperties.getProperty("java.vm.name")); System.out.println("java.version=" + systemProperties.getProperty("java.version")); System.out.println("java.vm.name=" + System.getProperty("java.vm.name")); System.out.println("java.version=" + System.getProperty("java.version"));
在通过命令行的 java 命令启动 Java 应用程序时,你可以主动设置 Java 系统属性的键值对,这一操作可通过 -D 参数 实现。例如:
java -Dkey1=value -cp . com.hxstrive.Demo
上面命令指示 Java 执行 com.hxstrive.Demo 类,将当前目录用作类路径,并将名为 key1 的系统属性设置为值 value1。
在命令行上设置的系统属性在运行时也可通过系统属性获取。你可以像这样在应用程序内部访问上面提到的key1属性,例如:
String key1Property = System.getProperty("key1");
更多信息参考 https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html API 文档。