Java IO:属性信息导入/导出

在 Java 里,系统属性代表着 Java 虚拟机(JVM)运行时的一些配置信息与环境信息。这些属性以键值对形式存在,键和值均为字符串。你可以借助系统属性来获取有关操作系统、Java 运行环境、用户信息等内容。

除此以外,用户还可以自定义到属性信息。但是,Java 虚拟机一旦关闭再启动就找不到自定义到属性了,如果要永久记录用户自定义到属性,则可以采用 Properties 类到 load()/store() 方法进行属性的导入/导出操作,即将属性信息写入到文件中和从文件中读取自定义属性信息,以实现信息到持久化存储。

JVM 系统属性

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 属性类

Properties 类属于 java.util 包,它继承自 Hashtable<Object,Object>,主要用于处理属性文件。属性文件一般以 .properties 作为扩展名,其内容是键值对,键和值均为字符串。例如:

image.png

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 对象。它可以通过以下方式创建 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 内容如下:

image.png

运行结果:

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();
        }
    }
}

运行结果:

image.png

通过上述内容,你已经了解 Properties 类的基本使用方法,从而在 Java 程序中方便地处理属性文件。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号