当前位置:首页 > 技术分析 > 正文内容

Java集合-Properties(JAVA集合面试题)

Properties(java.util.Properties)类,跟Map的key和value都为String类型比较相似,Properties类可以将 c key和 value键值对写道磁盘的properties文件中,然后可以再次读出来。本文讲述 Properties常用的机制。

创建Properties实例

为了使用Properties类,则必须使用Properties的实例,可以通过构造函数创建:

Properties properties = new Properties();

设置Properties

可以通过setProperty()方法设置property (key - value):

properties.setProperty("email", "john@doe.com");

设置了email为john@doe.com。

获取Properties

可以通过getProperty()获取对应key的值:

String email = properties.getProperty("email");

移除Properties

可以通过remove()方法移除指定的键值对,参数是key:

properties.remove("email");

迭代Properties

可以通过key迭代Properties :

Properties properties = new Properties();
 
properties.setProperty("key1", "value1");
properties.setProperty("key2", "value2");
properties.setProperty("key3", "value3");
 
Iterator keyIterator = properties.keySet().iterator();
 
while(keyIterator.hasNext()){
    String key   = (String) keyIterator.next();
    String value = properties.getProperty(key);
    System.out.println(key + " = " + value );
}

上面例子输出结果:

key1 = value1
key2 = value2
key3 = value3

存储Properties到文件

可以通过store()方法将Properties的key-value存储到Properties文件中并且可以读出来:

Properties properties = new Properties();
 
properties.setProperty("property1", "value1");
properties.setProperty("property2", "value2");
properties.setProperty("property3", "value3");
 
try(FileWriter output = new FileWriter("data/props.properties")){
    properties.store(output, "These are properties");
} catch (IOException e) {
    e.printStackTrace();
}

Property文件编码

Properties文件的默认代码ISO-8859-1(Latin-1),然而我们常用的是 UTF-8编码,可以通过FileWriter构造函数的第二个参数指定具体的编码格式:

try(FileWriter output = new FileWriter("data/props.properties", Charset.forName("UTF-8"))){
    properties.store(output, "These are properties");
} catch (IOException e) {
    e.printStackTrace();
}

Property文件格式

Properties文件中每一行的格式是key=value:

#These are properties
#Thu Jul 04 21:29:20 CEST 2019
property2=value2
property1=value1
property3=value3

#开头的是注释。

加载文件的数据到Properties

可以通过Properties的load() 方法将文件的数据加载到Properties:

Properties properties = new Properties();
 
try(FileReader fileReader = new FileReader("data/props.properties")){
    properties.load(fileReader);
} catch (IOException e) {
    e.printStackTrace();
}

加载Properties文件指定编码

load()默认加载编码是ISO-8859-1 (Latin-1),如果需要使用其他格式,例如UTF-8,可以在使用 FileReader的第二个参数指定 UTF-8加载文件:

try(FileReader fileReader = new FileReader("data/props.properties", Charset.forName("UTF-8"))){
    properties.load(fileReader);
} catch (IOException e) {
    e.printStackTrace();
}

存储Properties中的数据到XML文件

Properties同样可以把数据存储到XML,调用storeToXML()方法:

Properties properties = new Properties();
 
properties.setProperty("property1", "value1");
properties.setProperty("property2", "value2");
properties.setProperty("property3", "value3");
 
try(FileOutputStream output = new FileOutputStream("data/props.xml")){
    properties.storeToXML(output, "These are properties");
} catch (IOException e) {
    e.printStackTrace();
}

Property XML文件编码

Properties XML property 文件默认的编码UTF-8,如果需要使用其他编码格式则使用第三个参数例如ISO-8859-1:

try(FileOutputStream output = new FileOutputStream("data/props.xml")){
    properties.storeToXML(output, "These are properties", Charset.forName("ISO-8859-1"));
} catch (IOException e) {
    e.printStackTrace();
}

XML Property文件格式

Properties对象存储到 XML文件格式如下:

<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>These are properties</comment>
<entry key="property2">value2</entry>
<entry key="property1">value1</entry>
<entry key="property3">value3</entry>
</properties>

请注意传递给storeToXML()方法的注释comment元素 是如何包含在注释XML元素中的,而不是包含在XML注释(<!-- -->) 。

从XML文件中加载到Properties

可以通过 Properties的loadFromXML()方法从xml文件中获取数据:

Properties properties = new Properties();
try(FileInputStream fileInputStream = new FileInputStream("data/props.xml")){
    properties.loadFromXML(fileInputStream);
} catch(IOException e){
    e.printStackTrace();
}

指定编码从XML中加载数据到Properties

默认loadFromXML() 方法加载XML文件的编码格式是UTF-8 ,注意,这与非XML属性文件的默认值相反,如果XML文件使用不同的编码,例如ISO-8859-1(Latin-1),则XML文件必须指定其中的编码。这是通过将以下行作为XML属性文件的第一行来实现的:

<?xml version="1.0" encoding="ISO-8859-1"?>

从Classpath 路径下加载Properties

可以加载classpath 下的properties数据到Properties, 因此,该文件可以与加载属性的应用程序位于同一个JAR文件中,或者在Java应用程序执行时位于Java类路径上的另一个JAR文件或目录中。要从类路径上可用的文件加载属性,需要首先获取类实例:

Class aClass = PropertiesExample.class;

一旦有了Class实例可以通过 getResourceAsStream() 方法返回InputStream

InputStream inputStream =
    aClass.getResourceAsStream("/myProperties.properties");

文件必须位于classpath的根目录下,如果需要加载子目录下的文件,需要这样
/subdir/myProperties.properties 。

使用InputStream 把文件数据加载到Properties实例中,可以使用load() 或者loadFromXML()方法:

Class aClass = PropertiesExample.class;
 
InputStream inputStream =
    aClass.getResourceAsStream("/myProperties.properties");
 
Properties fromClasspath = new Properties();
 
try {
    fromClasspath.load(inputStream);
} catch (IOException e) {
    e.printStackTrace();
}

ResourceBundle Properties

Java中包含一个特殊类型的-ResourceBundle,ResourceBundle是一个文件包,它们一起构成一个bundle。通常,每个文件都包含一组针对特定语言的属性。因此,每个文件通常都包含相同的属性键集,但其值特定于该文件所针对的语言。ResourceBundle属性文件通常从classpath加载。ResourceBundle是国际化应用程序的常用方法。

默认Properties

Java Properties类能够为没有在Properties实例中注册任何键的属性提供默认属性值。有两种使用默认属性值的方法:

  • 为getProperty()方法提供默认的值
  • 创建Properties 实例时,提供包含默认值的Properties

getProperty()的默认值

getProperty()有个重载方法可以给定指定的默认值:

Properties properties = new Properties();
 
String preferredLanguage =
    properties.getProperty("preferredLanguage", "Danish");

如果 Properties实例中不包括key为preferredLanguage的实例,那么将返回Danish 。

使用默认的Properties实例作为默认值

Java Properties类可以用另一个Properties实例实例化,该实例包含在新创建的Properties实例不包含请求的属性键的值时要使用的默认值:

Properties defaultProperties = new Properties();
defaultProperties.setProperty("preferredLanguage", "Danish");
 
Properties newProperties = new Properties(defaultProperties);
String language = newProperties.getProperty("preferredLanguage");
 
System.out.println("Preferred language: " + language);

在newProperties实例中我们没有设置preferredLanguage 的值,那么将取 defaultProperties中对应的preferredLanguage 的值。 f

系统Properties

System Properties 是Property的一个特殊实例:

Properties systemProperties = System.getProperties();

可以通过 System.getProperty() 获取值和 System.setProperty() 设置值:

System.setProperty("key1", "value1");
String value1 = System.getProperty("key1");
 
//The above is equal to:
 
Properties systemProperties = System.getProperties();
 
systemProperties.setProperty("key1", "value1");
String value1 = systemProperties.getProperty("key1");

通过系统命令设置System Properties

启动项目时可以通过-D参数设置System properties:

java -Dkey1=value -cp . com.jenkov.MyApp

设置System property 名称key1和值 value1.

获取key1是这样:

String key1Property = System.getProperty("key1");

参考:
http://tutorials.jenkov.com/java-collections/properties.html

http://tutorials.jenkov.com/unicode/utf-8.html

https://blog.csdn.net/cgsyck/article/details/108449964

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3682.html

标签: java 国际化
分享给朋友:

“Java集合-Properties(JAVA集合面试题)” 的相关文章

如何做好精细化管理,实现全流程高效落地,牢记这4点

本文选自头条号@业绩增长系统???????????该资料?共有完整版42页,对于学习之人非常具有参考价值,值得深度学习精细化的费用管理是提升企业费效的必经之路,精细化管理”顾名思义就是“精确、细致、深入、规范”的全面管理模式领取方式:1、?关注?+评论+转发此文?2、主页S信?:999免费?获得?这...

Linux世界的多样性:yum和apt的对比,让你感受不同发行版的特色

yum和apt是两种常用的Linux软件包管理器,它们都可以用来安装、更新和删除软件包。但是,它们之间也有一些重要的区别,本文将对它们进行分析对比。yum是Yellowdog Updater Modified的缩写,它是基于RPM(Red Hat Package Manager)的软件包管理器,主要...

手把手教你Vue之父子组件间通信实践讲解【props、$ref 、$emit】

组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用。那么组件间如何通信,也就成为了vue中重点知识了。这篇文章将会通过props、$ref和 $emit 这几个知识点,来讲解如何实现父子组件间通信。转载链接:https://www.jia...

Git分布式系统---Gitlab多人工作流程

前言在上一次推文中,我们已经很清楚的讲解了如何创建本地仓库、提交(push)项目到远程仓库以及从远程仓库clone(克隆)项目到本地的相关操作。大家可以先去看前面的推文(快速掌握Git分布式系统操作)点击查看目前无论你是否步入社会还是在校学生,都会使用Gitlab来进行团队的代码管理。(可以这样说:...

「Git迁移」三行命令迁移Git包含提交历史,分支,tag标签等信息

问题描述:公司需要将一个git远程服务器的全部已有项目迁移到一台新服务器的Gitlab中,其中需要包含全部的提交纪录,已有的全部分支与全部打tag标签,目前此工作已全部迁移完毕,特此记录一下操作步骤环境描述:1. 要迁移的远程Git:Gitblit2. 迁移目的Git:Gitlab3. 暂存代码的P...

7 招教你轻松搭建以图搜图系统

作者 | 小龙责编 | 胡巍巍当您听到“以图搜图”时,是否首先想到了百度、Google 等搜索引擎的以图搜图功能呢?事实上,您完全可以搭建一个属于自己的以图搜图系统:自己建立图片库;自己选择一张图片到库中进行搜索,并得到与其相似的若干图片。Milvus 作为一款针对海量特征向量的相似性检索引擎,旨在...