web-dev-qa-db-ja.com

読み込みJava静的初期化ブロック内のプロパティ

少し機密性の高いデータに対して文字列操作を行う静的utilクラスがあります。このクラスを使用する前に、.propertiesファイルに保存したいユーザー名/パスワードなどの値で特定の静的変数を初期化する必要があります。

.propertiesファイルのロードがJavaでどのように機能するか、特に* Spring DI *コンテナの外部ではあまり詳しくありません。誰でも私にこれをどのように行うことができるかについての手掛かり/洞察を与えることができますか?

ありがとうございました!

追加:.propertiesファイルの正確な場所は不明ですが、クラスパス上にあります。 classpath:/my/folder/name/myproperties.propetiesのような

21
xelurg
  1. チェックアウト Java.util.Properties

  2. 静的初期化子を使用できます。したがって、クラスの上で次のことができます。


 static {
    Properties props = new Properties();
    InputStream Steam = ...; // open the file
    props.load(stream);

    // process properties content
    String username = props.getProperty("username");
  }
6
notnoop

次のいずれかを使用します。

CurrentClassName.class.getResourceAsStream 
new FileInputStream(File)

クラスがクラスパスにあるかクラスパスにないかに応じて、入力ストリームを取得します。次に使用します

Properties.load

プロパティをロードします。

3
stevedbrown

久しぶりですが、私が正しく覚えていれば、次のようなことをするだけです。

Properties prop = new Properties();
prop.load(new FileInputStream(filename));

//For each property you need.
blah = prop.getProperty(propertyname);
2
patros

私にとってMyClass.class.getClassLoader().getResourceAsStream(..)はトリックをしました:

private static final Properties properties;

static {
    Properties fallback = new Properties();
    fallback.put(PROP_KEY, FALLBACK_VALUE);

    properties = new Properties(fallback);

    try {
        try (InputStream stream = MyClass.class.getClassLoader().getResourceAsStream("myProperties.properties")) {
            properties.load(stream);
        }
    } catch (IOException ex) {
        // handle error
    }
}
1
electrobabe

静的プロパティの場合、クラスに1回読み込まれるシングルトンとして初期化することは理にかなっています。次に例を示します。

class Example
{
    public final static String PROPSFILE = "test.properties";

    private static Properties props;

    protected static Properties getProperties()
    {
        if(props == null)
        {
            props = new Properties();
            props.load(new FileInputStream(new File(PROPSFILE));
        }
        return props;
    }

    public static User getUser()
    {
        String username = getProperties().getProperty("username");
        return new User(username);
    }
}

相対パス名を使用する場合は、クラスパスが正しく設定されていることを確認してください。

1
Daff

私は@Daffに同意します。シングルトンクラスを使用する方が良いかもしれません。これは、同様の要件のためにプロジェクトに持っているものです。

クラスのクライアントは次のように使用できます。

ConfigsLoader configsLoader = ConfigsLoader.getInstance("etc/configs.xml");

System.out.format("source dir %s %n", configsLoader.getSourceDir());

そしてクラス:

パブリッククラスConfigsLoader {

private String sourceDir;
private String destination;
private String activeMqUrl;

private static Logger log = Logger.getLogger(ConfigsLoader.class.getName());

private static ConfigsLoader instance = null;

private ConfigsLoader(String configFileName) {
    log.info("loading configs");
    Properties configs = new Properties();
    try {
        configs.loadFromXML(new FileInputStream(configFileName));

        sourceDir = configs.getProperty("source.dir");
        destination = configs.getProperty("destination");
        activeMqUrl = configs.getProperty("activemqconnectionurl");
        configs.setProperty("lastLoaded", new SimpleDateFormat("yyyy-M-d HH:mm").format(new Date()));
        configs.storeToXML(new FileOutputStream(configFileName), "saving last modified dates");

    } catch (InvalidPropertiesFormatException e) {
        log.log(Level.SEVERE,"Error occured loading the properties file" ,e);
    } catch (FileNotFoundException e) {
        log.log(Level.SEVERE,"Error occured loading the properties file" ,e);
    } catch (IOException e) {
        log.log(Level.SEVERE,"Error occured loading the properties file" ,e);
    }
}

public static ConfigsLoader getInstance(String configFileName) {
    if(instance ==null) {
        instance = new ConfigsLoader(configFileName);
    }

    return instance;
}

public String getSourceDir() {
    return sourceDir;
}

public void setSourceDir(String sourceDir) {
    this.sourceDir = sourceDir;
}

public String getDestination() {
    return destination;
}

public void setDestination(String destination) {
    this.destination = destination;
}

public String getActiveMqUrl() {
    return activeMqUrl;
}

public void setActiveMqUrl(String activeMqUrl) {
    this.activeMqUrl = activeMqUrl;
}

}

0
Mosd

最後に、静的コードブロックが書き込まれているクラスに関連付けられたgetResourceAsStream()関数を使用してこれを行いました。

//associate Property and ImputStream imports
public class A {
    static Properties p;
    static {
      p = new Properties();
      try {
          InputStream in = A.class.getResourceAsStream("filename.properties");
          p.load(in);
      } catch (FileNotFoundException e) {
        System.out.println("FileNotFoundException");
        e.printStackTrace();
      } catch (IOException e) {
        System.out.println("IOException");
        e.printStackTrace();
      }
    }
    .
    .
    .
}
0
kung_fu_coder