java读取properties配置信息工具类编写

0 引言

在项目中通常一些配置信息是要写在配置文件中的,方便修改参数,能起到流程自动化的目的,本文对Properties类如何读取配置文件信息的方法进行了详细讲解

1 java properties对象

(1)Java中有个比较重要的的类Properties(java.util.Properties),是代表一个持久的一套详细属性,属性可以被保存到一个流或从流中加载的类。以下是关于属性的要点:

  • 属性列表中每个键及其对应值是一个字符串。

  • 一个属性列表可包含另一个属性列表作为它的“默认”,第二个属性可在列表中搜索,如果没有在原有的属性列表中找到的属性键。

  • 这个类是线程安全的;多个线程可以共享一个Properties对象,而不需要外部同步

(2) 该类的主要方法如下:

(3)主要用于读取Java配置文件,存放一些经常用到的数据,方便程序员修改。该配置文件是个文本文件,后缀名为(.properties),

文件的内容格式为“key=value”,文本注释可以使用”#“来注释。如下图:

(4)Java Properties实例

  •    从目标路径test.properites中获取输入流对象。后缀必须是.properties
  •    使用Properties类的load()方法从字节输入流中获取数据
  •   使用Properties类的getProperty(String key)方法,根据参数key获取value

2 工具类的编写

package testproperties;

import org.apache.hadoop.conf.Configuration;
import org.apache.log4j.Logger;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.net.URI;

public class PropertyFileReader {

    private static final Logger logger = Logger.getLogger(PropertyFileReader.class);
    private static Properties prop = new Properties();

    public static void main(String[] args) throws IOException {

        PropertyFileReader pfr = new PropertyFileReader();
        Properties pro = pfr.readLocalPropertyFile("test.properties");
        String url = pro.getProperty("url");
        System.out.println(url);
        

    }

//从本地读取
    public static Properties readLocalPropertyFile(String filename) throws IOException {

        if (prop.isEmpty()) {

            InputStream input = PropertyFileReader.class.getClassLoader().getResourceAsStream(filename);
            try {
                prop.load(input);
            } catch (IOException e) {
                logger.error(e);
                throw e;
            } finally {
                if (input != null) {
                    input.close();
                }

            }

        }
        return prop;
    }
//从HDFS读取
    public static Properties readHdfsPropertyFile(String defaultFS, String path) throws Exception {
        {
            if (prop.isEmpty()) {
                Configuration config = new Configuration();
                config.set("fs.defaultFS", defaultFS);
                FileSystem hdfs = FileSystem.get(new URI(defaultFS), config, "test");
                FSDataInputStream fs = hdfs.open(new Path(path));
                InputStream input = fs.getWrappedStream();
                try {
                    prop.load(input);
                } catch (IOException ex) {
                    logger.error(ex);
                    throw ex;
                } finally {
                    if (input != null) {
                        input.close();
                    }
                }
            }
            return prop;
        }
    }
}

测试结果如下:

拓展: 对于shell脚本类读取配置文件及HDFS文件,也比较简单可以通过命令行直接获取.如下:

cat /home/centos/phm/JTTL_ETL_COMMON/oozieurl.txt | grep oozie_url | awk -F'=' '{ print $2 }' | sed s/[[:space:]]//g

读取/home/centos/phm/JTTL_ETL_COMMON/oozieurl.txt文件并过滤出oozie_url行,取以"="分割的第二列。

注意:此处必须使用sed s/[[:space:]]//g 去除 多余的空格符,防止格式带来的错误。

如果要读取HDFS上的内容将上述命令替换成hadoop的命令即可,如:

hadoop fs -cat /home/centos/phm/JTTL_ETL_COMMON/oozieurl.txt | grep oozie_url | awk -F'=' '{ print $2 }' | sed s/[[:space:]]//g

3 小结

一般对于线上生产环境中,我们往往将一些参数放置在配置文件中或集群共享目录中(如HDFS),方便程序员修改,也是一种自动化流程的实现。本文讲解了如何通过Properties类如何读取配置文件信息的方法,一个是从本地资源文件中获取,一个是从HDFS共享目录中获取。

猜你喜欢

转载自blog.csdn.net/godlovedaniel/article/details/114449144