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数据。

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

相关推荐
零千叶9 分钟前
【面试】AI大模型应用原理面试题
java·设计模式·面试
坐吃山猪5 小时前
SpringBoot01-配置文件
java·开发语言
我叫汪枫5 小时前
《Java餐厅的待客之道:BIO, NIO, AIO三种服务模式的进化》
java·开发语言·nio
yaoxtao5 小时前
java.nio.file.InvalidPathException异常
java·linux·ubuntu
Swift社区7 小时前
从 JDK 1.8 切换到 JDK 21 时遇到 NoProviderFoundException 该如何解决?
java·开发语言
DKPT7 小时前
JVM中如何调优新生代和老生代?
java·jvm·笔记·学习·spring
phltxy7 小时前
JVM——Java虚拟机学习
java·jvm·学习
seabirdssss9 小时前
使用Spring Boot DevTools快速重启功能
java·spring boot·后端
喂完待续9 小时前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升