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 示例代碼
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 示例代碼
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 示例代碼
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 示例代碼
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數據。

根據具體需求選擇合適的方法來處理應用首選項。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72611.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72611.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72611.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

工作記錄 2017-02-04

工作記錄 2017-02-04 序號 工作 相關人員 1 修改郵件上的問題。 更新RD服務器。 郝 更新的問題 1、DataExport的設置中去掉了ListPayors,見DataExport\bin\dataexport.xml 2、“IPA/Group Name” 改為 “Insurance Name”。 3、修改了Payment Posted的E…

dataframe數據形式操作中的diff和shift函數區別與對比

問題分析 從錯誤日志中可以看到,代碼在 report_services.py 的 gnss_monthly_report 函數中出現了 ValueError,具體錯誤信息是: ValueError: either both or neither of x and y should be given這個錯誤發生在以下代碼行: rep…

C語言動態內存管理(下)

歡迎拜訪:霧里看山-CSDN博客 本篇主題:C語言動態內存管理(下) 發布時間:2025.3.18 隸屬專欄:C語言 目錄 動態內存常見錯誤內存泄漏(Memory Leak)典型場景后果解決方案 懸掛指針(Dangling Pointe…

Vue:Vue2和Vue3創建項目的幾種常用方式以及區別

前言 Vue.js 和 Element UI 都是用 JavaScript 編寫的。 1、Vue.js 是一個漸進式 JavaScript 框架。2、Element UI 是基于 Vue.js 的組件庫。3、JavaScript 是這兩個項目的主要編程語言。 而Element Plus是基于TypeScript開發的。 一、Vue2 1、基于vuecli工具創建 vue2 …

機器人曲面跟蹤Surface-Tracking

定義 機器人曲面跟蹤(Surface-Tracking)是指機器人通過實時感知工件曲面的三維形貌,動態調整運動軌跡和位姿,以精確跟隨曲面進行加工(如打磨、拋光、噴涂等)的技術。 力 - 位姿協同控制 力控模式&#xff…

網絡安全運維應急響應與溯源分析實戰案例

在日常運維過程中,網絡安全事件時有發生,快速響應和精準溯源是保障業務穩定運行的關鍵。本文將通過一個實際案例,詳細解析從發現問題到溯源定位,再到最終解決的完整流程。 目錄 一、事件背景 二、事件發現 1. 監控告警觸發 2…

【AVRCP】藍牙協議棧深度解析:AVCTP互操作性核心機制與實現細節

目錄 一、事務標簽(Transaction Label)機制 1.1 事務標簽核心規則 1.2 事務標簽作用域與并發性 1.3 實現建議與陷阱規避 1.4 協議設計思考 1.5 調試與驗證 二、消息分片(Fragmentation)機制 2.1 分片觸發條件 2.2 分片支…

harmonyOS NEXT開發與前端開發深度對比分析

文章目錄 1. 技術體系概覽1.1 技術棧對比1.2 生態對比 2. 開發范式比較2.1 鴻蒙開發范式2.2 前端開發范式 3. 框架特性對比3.1 鴻蒙 Next 框架特性3.2 前端框架特性 4. 性能優化對比4.1 鴻蒙性能優化4.2 前端性能優化 5. 開發工具對比5.1 鴻蒙開發工具5.2 前端開發工具 6. 學習…

OpenWebUI:一站式 AI 應用構建平臺體驗

🚀 大家好,今天給大家分享一個超棒的 AI 應用構建工具——OpenWebUI!體驗下來,只能說絲滑!必須強烈推薦! 🔥 聽說過阿里巴巴的 Qwen 嗎?他們最新的 Qwen Chat 網站就是用 OpenWebUI…

多線程—進程與線程

1 進程 1.1 進程概念 進程:操作系統提供的一種抽象,當程序在運行時,好像計算機的所有硬件資源都在為其服務。換言之,進程就是程序的一次運行過程。進程是操作系統分配資源的基本單位。 注意:區分進程和程序&#xff0…

[原創](Modern C++)現代C++的關鍵性概念: 靈活多變的綁定: std::bind

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 開發工具: Visual Studio、Delphi、XCode、C …

ssm框架之mybatis框架動態SQL

1 mybatis動態sql mybatis可以通過各種各樣的標簽在sql映射文件中實現如下功能 1、語句的動態拼接 2、前后綴格式處理 3、復雜參數處理 常用標簽如下: 1.1 if標簽 如下示例,當有一個入參為null或者空的時候的時候,不參與計算,…

Spring Boot 事務詳解

Spring Boot 事務詳解 引言 在現代應用程序中,事務管理是確保數據一致性和完整性的重要機制。Spring Boot 提供了強大的事務管理功能,使得開發者可以輕松地定義和管理事務。本文將詳細介紹 Spring Boot 中的事務管理,包括事務傳播行為、事務…

poetry使用

1.初始化 package name 填入口文件名 poetry init2.在本目錄下虛擬 poetry config virtualenvs.in-project true 3.自動生成依賴文件和vent虛擬環境,管理本項目下載包 poetry add flask pandas numpy 4 4.下載依賴 poetry install 5.查看都安裝了什么包 poe…

Git 新建本地分支并關聯到遠程倉庫

文章目錄 1、方法一2、方法二 1、方法一 A、新建本地分支: git checkout -b new-branch-nameB、push新分支到遠程倉庫: git push origin newBranchC、本地分支關聯到遠程(選一個即可): git branch --set…

一條SQL在mysql數據庫中經歷的過程

SQL語句在MySQL數據庫中普遍經歷的過程如下: 客戶端發起查詢請求到MySQL數據庫服務器監聽端口; MySQL數據庫server端接收到請求; server端從已有的連接池或者新建一個線程,用來處理客戶端發起的請求; server層…

Compose 的產生和原理

引言 compose 出現的目的: 重新定義android 上ui 的編寫方式。為了提高android 原生ui開發效率。讓android 的UI開發方式跟上時代。 正文 compose 是什么? 就是一套ui框架 和flutter 一樣是一套ui框架 Flutter:跨平臺開發趨勢與企業應用的…

【計算機網絡】一二章

一 二 非常棒的例子 相同的傳播時延,帶寬越大,該鏈路上所能容納的比特數越多 相同的傳播時延,帶寬越大,該鏈路上所能容納的比特數越多 往返時間(Round-Trip Time,RTT)s是指從發送端發送數據分組…

微軟OneNote無法同步解決方案

目錄 前言原因UWP特性 解決方案C***h注冊表 參考鏈接 前言 假設有多臺Windows電腦,最方便且免費的多設備筆記同步方案就是微軟自家的OneNote,使用OneDrive自帶的5G云存儲。 但是在國內大陸的OneNote,經常會出現無法同步、同步失敗&#xff1…

《商業智能(BI)的演進:從數據倉庫到智能決策》

01、什么是商業智能BI? 商業智能BI - 派可數據商業智能BI可視化分析平臺 首先要了解什么是商業智能BI( Business Intelligence )?百度商業智能BI有很多很多官方的定義,各種解釋,實際上從這么多年的經驗出發…