Java Preferences类做本地存储

1. Preferences使用场景

Preferences类可以用在项目中做一个本地小存储。比如小型的一些软件配置项目,内部存储时会以key/value的形式存储。但是最终的本地存储方式会被序列化为xml。在不同的系统下Preferences有其不同的实现。

2. 场景示例

最近正好做了一个springboot web项目,需要做一个软件授权证书,由我们生成证书给到客户,客户需要导入证书才能获得系统使用的授权。证书有有效期限限制。

找了一个开源工具truelicense-core,看了源码后发现它使用了Preferences来保存最终生成的证书key。于是学习了一下Preferences类。

3. Preferences在truelicense-core中的作用

truelicense-core在项目中安装证书时,会最终把加密的key通过Preferences写入,由于证书和授权本身并没有类似数据库这样的持久化存储做支持,所以当客户使用证书安装授权后,在授权期内需要能够保存用户的授权状态,否则项目每次重启都会进行一次授权。这是不合理的。而truelicense-core正是通过Preferences类存储了安装的key

4. Preferences写入的数据在哪里

Preferences本身是个抽象类,它有三个不同的工厂类,可以根据不同平台生产对应的Preferences类。Java源码如下

源码可以看出Preferences支持:windows、os x、和其他类unix平台

在windows下,Preferences类最终将数据保存在系统的注册表中。通常我们使用Preferences会使用userNodeForPackage方法获取,而不会获取系统的节点

例如如下的代码:

这样获取到的Preferences最终会写入 HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs 这个注册表节点,写入的节点层级是LicenseVerify所在的包路径,假设LicenseVerify在com.abc包路径下,则完整的注册表层级为:HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs\com.abc这个节点下。

在linux平台因为并没有注册表的存在,Java使用文件系统做存储。存储的路径是在:

如果user.home指向app用户的家目录,则存储的完整路径为:/home/app/.java/userPrefs/com/abc。在linux上存储直接被存为xml文件,可以打开查看。而windows下需要程序读取导出xml。

Original: https://www.cnblogs.com/leemz-coding/p/16009323.html
Author: 框架搬运工
Title: Java Preferences类做本地存储

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/620278/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • spring boot中自动配置应用场景

    1,在pom.xml中添加一个starter依赖,相应的依赖都加进来了,不需要一个一个加依赖; 2,在application.yaml文件中添加themleaf配置信息默认就用th…

    Java 2023年5月30日
    074
  • JSP、JSTL标签、EL表达式

    JSP、JSTL标签、EL表达式 1、EL表达式:${} 功能: 获取数据 执行运算 获取web开发的常用对象 2、JSP标签 例如: jsp标签还有很多功能,这里只列举出一种。 …

    Java 2023年6月13日
    079
  • 搜索精准度优化架构方案

    概述 实现公司对内容精准化搜索和用户精准化推送的目标。 采用方案 搜索技术+数据挖掘+机器学习(未来)+人工审核(现在) 人员配备 1-2人专职开发(未来深入,人数更多) 大致流程…

    Java 2023年6月8日
    084
  • Java实现九九乘法表(三种方法实现)

    题目要求: /*输出以下九九&#x4E5…

    Java 2023年6月9日
    059
  • 【异常】[ERROR] error: java.lang.StackOverflowError,at scala.tools.nsc.transform.Erasure$Eraser.adaptMember(Erasure.scala:646)

    1 完整异常信息 java;gutter:true;[ERROR] error: java.lang.StackOverflowError[INFO] at scala.tools…

    Java 2023年5月29日
    072
  • JNI C反射调用java方法

    ④通过对象调用方法,可以调用空参数方法,也可以调用有参数方法,并且将参数通过调用的方法传入(void (CallVoidMethod)(JNIEnv, jobject, jmeth…

    Java 2023年5月29日
    088
  • 归并排序

    归并排序 本文分为以下几个部分 问题引入 master 公式 归并排序 写在最后 问题引入 求一串非空数组中的最大值,使用O(n)的时间复杂度。 最直接想到的代码就是直接一次遍历 …

    Java 2023年6月5日
    067
  • Git:克隆别人仓库到本地,再推送到自己的远程仓库

    看别人写的很复杂,自己摸索了一下 fork 最简单的直接fork到自己远程仓库,然后 clone一下到本地 clone后再推送 clone 删除本地的 .git文件,然后add、c…

    Java 2023年6月7日
    088
  • windows container (docker) 容器资料笔记

    业务需求:简化公司私有云,公有云的部署,尝试寻找更好的,更优化的技术方案替换现有的虚拟机部署方案。 技术背景: .net Docker 学习资料 Windows container…

    Java 2023年6月8日
    068
  • Spring 5 源码解析- 事务原理分析-6

    事务配置 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http:/…

    Java 2023年6月6日
    075
  • RPC学习

    设计协议 相对于 HTTP 的用处,RPC 更多的是负责应用间的通信,所以性能要求相对更高。但 HTTP 协议的数据包大小相对请求数据本身要大很多,又需要加入很多无用的内容,比如换…

    Java 2023年6月8日
    0113
  • SpringBoot 集成CAS简单学习

    CAS服务搭建 可以直接放在Tomcat中启动,这里可以为了方便直接用IDEA搭建启动。如果直接拉取示例代码以下内容都已修改完毕。拉取代码直接使用。 # 取消票根对应的Cookie…

    Java 2023年6月9日
    0106
  • 设计模式之一单例模式(java实现)

    学习一下各种设计模式,看以后的用不用得上╮(╯_╰)╭ 1. 饱汉式 懒汉式缺点:不管用不用这个对象,都会实例化,浪费资源; 2 饿汉式 恶汉式也带来了问题,就是线程不安全 3. …

    Java 2023年6月6日
    082
  • 上班摸鱼与网络安全

    上班不摸鱼,那这班上的没有灵魂啊。但是不久前爆出的国美网络监控事件,也提示我们网络有风险,摸鱼需谨慎。 https://baijiahao.baidu.com/s?id=17167…

    Java 2023年6月15日
    090
  • HIT软构博客5–LAB2记录与总结

    本次实验我学习了ADT的设计、规约、测试,并使用OOP技术实现 ADT。 ​ 首先按照给定的需求,从中根据名词找到对应需要设计的ADT,然后确定ADT内所需要的方法,设计方法的sp…

    Java 2023年6月5日
    094
  • xhydra的基础使用

    console–xhydra 在Target-Single Target输入目标IP(单个) 而Target List是批量爆破 Port:对应端口 Protocol:…

    Java 2023年6月7日
    062
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球