一种通过变量插值读取属性的方法

最近,我尝试在应用程序服务器中定义和读取全局属性。 在应用程序服务器中配置的此类属性的好处–可以在此服务器上部署的所有Web应用程序之间共享该属性。 每个部署的应用程序都可以读取同一属性,该属性仅在一个位置配置一次。 我试图做的是在值部分中包含另一个系统属性的系统属性。 在应用服务器JBoss / WildFly中,您可以例如在配置文件standalone.xml定义系统属性。 我设置属性exporting.service.config.file

<system-properties>
    <property name="exporting.service.config.file" value="${jboss.server.config.dir}\exporting\exporting-service.properties"/>
</system-properties>

jboss.server.config.dir指向JBoss中的基本配置目录。 此属性由JBoss自动设置。 在这个例子中,我们有一个所谓的Variable Interpolation维基百科的定义 :“变量插值(也就是变量替换或变量扩展)是评估包含一个或多个占位符的字符串文字的过程,产生的结果是将占位符替换为其对应的值”。 属性值${...}占位符的另一个示例是以下配置:

application.name=My App
application.version=2.0
application.title=${application.name} ${application.version}

现在,当我们尝试使用Java的System.getProperty(...)从第一个示例获取系统属性时

String globalConfigFile = System.getProperty("exporting.service.config.file");

我们将获得${jboss.server.config.dir}\exporting\exporting service.properties 。 占位符${jboss.server.config.dir}未解析。 第二个例子中也有同样的麻烦。

用变量插值读取属性的最简单方法是什么? 嗯,有带有PlaceholderConfigurerSupport的Spring框架等等。 但是拥有如此大的框架(如依赖关系)是一项开销。 有轻量级的图书馆吗? 是的,可以确定-Apache Commons Configuration 。 Apache Commons Configuration为属性提供了特殊的前缀名称,以便在特定上下文中评估它们。 例如:

  • sys:此前缀将变量标记为系统属性。 Commons Configuration将搜索具有给定名称的系统属性,并将变量替换为其值。
  • const:前缀表示将变量解释为类的常量成员字段。 变量的名称必须是完全限定的类名称。
  • env:前缀引用特定于OS的环境属性。

文档中的一些示例:

user.file = ${sys:user.home}/settings.xml
action.key = ${const:java.awt.event.KeyEvent.VK_CANCEL}
java.home = ${env:JAVA_HOME}

现在,我可以将所需的依赖项添加到我的Maven项目中

<dependency>
    <groupId>commons-configuration</groupId>
    <artifactId>commons-configuration</artifactId>
    <version>1.10</version>
</dependency>

jboss.server.config.dir之前设置前缀sys:

<system-properties>
    <property name="exporting.service.config.file" value="${sys:jboss.server.config.dir}\exporting\exporting-service.properties"/>
</system-properties>

并编写以下代码

import org.apache.commons.configuration.SystemConfiguration;

...

SystemConfiguration systemConfiguration = new SystemConfiguration();
String globalConfigFile = systemConfiguration.getString("exporting.service.config.file");
...

我笔记本上的字符串globalConfigFile的值为C:\Development\Servers\jboss-as-7.1.1.Final\standalone\configuration\exporting\exporting-service.properties 。 前缀sys:将变量标记为系统属性。 Commons Configuration将搜索具有给定名称的系统属性,并将变量替换为其值。 完整的代码:

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.SystemConfiguration;

...

PropertiesConfiguration propertiesConfiguration = new PropertiesConfiguration();
SystemConfiguration systemConfiguration = new SystemConfiguration();
String globalConfigFile = systemConfiguration.getString("exporting.service.config.file");
if (globalConfigFile != null) {
    try {                
        propertiesConfiguration.setDelimiterParsingDisabled(true);                
        propertiesConfiguration.load(globalConfigFile);
    } catch (ConfigurationException e) {
        LOG.log(Level.INFO, "Cannot read global properties");
    }            
}

任何单个属性都可以读取,例如

propertiesConfiguration.getString("someKey")
propertiesConfiguration.getString("someKey", someDefaultValue)
propertiesConfiguration.getBoolean("someKey")
propertiesConfiguration.getBoolean("someKey", someDefaultValue)
propertiesConfiguration.getInteger("someKey")
propertiesConfiguration.getInteger("someKey", someDefaultValue)

usw。 就这样。 让我知道是否知道使用变量插值读取属性的另一种简单方法。

翻译自: https://www.javacodegeeks.com/2015/04/a-way-to-read-properties-with-variable-interpolation.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要了解如何读取txt文件中的数据。一种简单的方法是使用 `$fscanf` 函数。假设你的txt文件是这样的: ``` 1 2 3 4 5 6 7 8 9 ``` 你可以使用以下代码来读取它: ```verilog module read_txt; reg [7:0] gray_data [0:2][0:2]; integer file; integer i, j; initial begin file = $fopen("gray_data.txt", "r"); for (i = 0; i < 3; i = i+1) begin for (j = 0; j < 3; j = j+1) begin $fscanf(file, "%h ", gray_data[i][j]); end end $fclose(file); end endmodule ``` 这段代码将txt文件中的数据存储在 `gray_data` 数组中。 接下来,你需要了解双线性插值的算法。假设你要将一个2x2的像素块放大到4x4。双线性插值算法可以用以下方式计算新像素的值: 1. 用原图像中的4个像素点的灰度值加权平均,计算出新像素点的灰度值。 2. 分别按照横向和纵向进行线性插值,得到新像素点在横向和纵向上的偏移量。 3. 将新像素点的灰度值和偏移量存储在输出图像中。 下面是一个简单的Verilog代码示例,实现了双线性插值算法: ```verilog module bilinear_interpolation( input [7:0] gray_data [0:1][0:1], // 原图像中的4个像素点的灰度值 output [7:0] new_pixel // 新像素点的灰度值 ); reg [7:0] pixel_00 = gray_data[0][0]; reg [7:0] pixel_01 = gray_data[0][1]; reg [7:0] pixel_10 = gray_data[1][0]; reg [7:0] pixel_11 = gray_data[1][1]; reg [7:0] h_interpolation_0; reg [7:0] h_interpolation_1; reg [7:0] v_interpolation; reg [7:0] weight_h_0; reg [7:0] weight_h_1; reg [7:0] weight_v; // 计算横向偏移量 weight_h_0 = 1'b1; weight_h_1 = 0; h_interpolation_0 = (pixel_00 * weight_h_0 + pixel_01 * weight_h_1) >> 1; weight_h_0 = 0; weight_h_1 = 1'b1; h_interpolation_1 = (pixel_10 * weight_h_0 + pixel_11 * weight_h_1) >> 1; // 计算纵向偏移量 weight_v = 1'b1; v_interpolation = (h_interpolation_0 * weight_v + h_interpolation_1 * ~weight_v) >> 1; // 存储新像素点的灰度值和偏移量 new_pixel = v_interpolation; endmodule ``` 在这个示例中,我们假设输入的原图像是一个2x2的像素块,存储在 `gray_data` 数组中。然后,我们按照上面的算法计算了新像素点的灰度值,并将其存储在 `new_pixel` 变量中。 请注意,这个例子只是一个简单的示例,实际实现中可能需要更多的代码来处理各种边界情况和像素块的大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值