java使用(Preference、Properties、XML、JSON)实现处理(读写)配置信息或者用户首选项的方式的代码示例和表格对比

在Java应用程序中,处理应用首选项(preferences)有多种方法,包括使用java.util.prefs.Preferences类、属性文件(如.properties文件)、XML文件和JSON文件。下面是每种方法的详细说明和代码示例,最后用表格对比各自的使用场景和优缺点差异。

1. 使用 java.util.prefs.Preferences

java.util.prefs.Preferences 类提供了一种平台无关的方式来存储和检索用户和系统首选项。

1.1 示例代码
java 复制代码
import java.util.prefs.Preferences;

public class PreferencesExample {
    public static void main(String[] args) {
        // 获取用户节点
        Preferences userPrefs = Preferences.userNodeForPackage(PreferencesExample.class);

        // 设置首选项
        userPrefs.put("username", "john_doe");
        userPrefs.putInt("fontSize", 14);

        // 获取首选项
        String username = userPrefs.get("username", "default_user");
        int fontSize = userPrefs.getInt("fontSize", 12);

        System.out.println("Username: " + username);
        System.out.println("Font Size: " + fontSize);

        // 删除首选项
        userPrefs.remove("username");
    }
}

2. 使用属性文件(.properties

属性文件是一种简单的键值对文件,常用于存储配置信息。

2.1 示例代码
java 复制代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertiesExample {
    public static void main(String[] args) {
        Properties properties = new Properties();
        String filename = "config.properties";

        // 读取属性文件
        try (FileInputStream fis = new FileInputStream(filename)) {
            properties.load(fis);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 设置属性
        properties.setProperty("username", "john_doe");
        properties.setProperty("fontSize", "14");

        // 保存属性文件
        try (FileOutputStream fos = new FileOutputStream(filename)) {
            properties.store(fos, "Application Configuration");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 获取属性
        String username = properties.getProperty("username", "default_user");
        String fontSize = properties.getProperty("fontSize", "12");

        System.out.println("Username: " + username);
        System.out.println("Font Size: " + fontSize);

        // 删除属性
        properties.remove("username");

        // 保存属性文件
        try (FileOutputStream fos = new FileOutputStream(filename)) {
            properties.store(fos, "Application Configuration");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 使用 XML 文件

XML文件提供了一种结构化的数据存储方式,适合复杂的配置信息。

3.1 示例代码
java 复制代码
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
import java.io.File;
import java.io.IOException;

public class XMLExample {
    public static void main(String[] args) {
        String filename = "config.xml";
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder;
        Document doc = null;

        // 读取XML文件
        try {
            docBuilder = docFactory.newDocumentBuilder();
            doc = docBuilder.parse(filename);
        } catch (ParserConfigurationException | SAXException | IOException e) {
            e.printStackTrace();
        }

        if (doc == null) {
            // 创建新的XML文档
            doc = docFactory.newDocument();
            Element rootElement = doc.createElement("configuration");
            doc.appendChild(rootElement);
        }

        // 获取根元素
        Element rootElement = doc.getDocumentElement();

        // 设置属性
        Element usernameElement = doc.createElement("username");
        usernameElement.appendChild(doc.createTextNode("john_doe"));
        rootElement.appendChild(usernameElement);

        Element fontSizeElement = doc.createElement("fontSize");
        fontSizeElement.appendChild(doc.createTextNode("14"));
        rootElement.appendChild(fontSizeElement);

        // 保存XML文件
        try {
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File(filename));
            transformer.transform(source, result);
        } catch (TransformerException e) {
            e.printStackTrace();
        }

        // 获取属性
        String username = rootElement.getElementsByTagName("username").item(0).getTextContent();
        String fontSize = rootElement.getElementsByTagName("fontSize").item(0).getTextContent();

        System.out.println("Username: " + username);
        System.out.println("Font Size: " + fontSize);

        // 删除属性
        rootElement.removeChild(usernameElement);

        // 保存XML文件
        try {
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File(filename));
            transformer.transform(source, result);
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    }
}

4. 使用 JSON 文件

JSON文件提供了一种轻量级的结构化数据存储方式,适合复杂的配置信息。

4.1 示例代码
java 复制代码
import org.json.JSONObject;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class JSONExample {
    public static void main(String[] args) {
        String filename = "config.json";
        JSONObject jsonObject = new JSONObject();

        // 读取JSON文件
        try (FileReader reader = new FileReader(filename)) {
            jsonObject = new JSONObject(new org.json.JSONTokener(reader));
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 设置属性
        jsonObject.put("username", "john_doe");
        jsonObject.put("fontSize", 14);

        // 保存JSON文件
        try (FileWriter writer = new FileWriter(filename)) {
            writer.write(jsonObject.toString(4)); // 4表示缩进
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 获取属性
        String username = jsonObject.getString("username");
        int fontSize = jsonObject.getInt("fontSize");

        System.out.println("Username: " + username);
        System.out.println("Font Size: " + fontSize);

        // 删除属性
        jsonObject.remove("username");

        // 保存JSON文件
        try (FileWriter writer = new FileWriter(filename)) {
            writer.write(jsonObject.toString(4)); // 4表示缩进
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5. 对比表格

方法 使用场景 优点 缺点
Preferences 用户和系统首选项,跨平台 - 简单易用 - 跨平台 - 自动处理持久化 - 无法直接编辑 - 存储位置可能不直观
属性文件(.properties 简单配置,易于编辑 - 简单易用 - 可直接编辑 - 跨平台 - 仅支持简单的键值对 - 不适合复杂结构的数据
XML 文件 复杂配置,需要结构化数据 - 支持复杂结构的数据 - 可直接编辑 - 跨平台 - 相对复杂 - 解析和生成XML文件需要额外的代码
JSON 文件 复杂配置,需要结构化数据 - 轻量级 - 支持复杂结构的数据 - 可直接编辑 - 跨平台 - 相对复杂 - 解析和生成JSON文件需要额外的库

总结

  • Preferences:适用于简单的用户和系统首选项,跨平台且自动处理持久化,但不便于直接编辑。
  • 属性文件(.properties:适用于简单的键值对配置,易于编辑和使用,但不适合复杂结构的数据。
  • XML 文件:适用于复杂的配置信息,支持结构化数据,易于编辑,但相对复杂,需要额外的代码来解析和生成XML文件。
  • JSON 文件:适用于复杂的配置信息,支持结构化数据,易于编辑,且相对轻量级,但需要额外的库来处理JSON数据。

根据具体需求选择合适的方法来处理应用首选项。

相关推荐
i***13242 分钟前
SpringCloud实战十三:Gateway之 Spring Cloud Gateway 动态路由
java·spring cloud·gateway
计算机徐师兄4 分钟前
Java基于微信小程序的食堂线上预约点餐系统【附源码、文档说明】
java·微信小程序·食堂线上预约点餐系统小程序·食堂线上预约点餐微信小程序·java食堂线上预约点餐小程序·食堂线上预约点餐小程序·食堂线上预约点餐系统微信小程序
无心水1 小时前
【分布式利器:腾讯TSF】10、TSF故障排查与架构评审实战:Java架构师从救火到防火的生产哲学
java·人工智能·分布式·架构·限流·分布式利器·腾讯tsf
Boilermaker19928 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
Cherry的跨界思维8 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
C_心欲无痕9 小时前
ts - tsconfig.json配置讲解
linux·前端·ubuntu·typescript·json
alonewolf_999 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子9 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
sheji34169 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java
恋爱绝缘体110 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit