Java 특성 파일을 사용하는 방법은 무엇입니까?


219

Java 특성 파일로 저장하고 나중에로드하고 반복하려는 구성 값의 키 / 값 쌍 목록이 있습니다.

질문 :

  • 파일을로드 할 클래스와 동일한 패키지에 파일을 저장해야합니까, 아니면 파일을 배치해야하는 특정 위치가 있습니까?
  • 파일이 특정 확장자로 끝나야합니까, 아니면 .txt괜찮습니까?
  • 코드에서 파일을로드하는 방법
  • 그리고 내부의 값을 어떻게 반복 할 수 있습니까?

답변:


245

InputStream을 속성에 전달할 수 있으므로 파일이 거의 모든 곳에서 호출 될 수 있습니다.

Properties properties = new Properties();
try {
  properties.load(new FileInputStream("path/filename"));
} catch (IOException e) {
  ...
}

다음과 같이 반복하십시오.

for(String key : properties.stringPropertyNames()) {
  String value = properties.getProperty(key);
  System.out.println(key + " => " + value);
}

특성 파일에 키가 없으면 어떤 값이 리턴됩니까?
Mitaksh Gupta

2
@MitakshGupta 전달한 이름의 속성이 파일 또는 기본 속성 목록에 없으면 returs null입니다. Javadoc
drigoangelo를

3
방법이 비교 않습니다 properties.load(PropertiesReader.class.getResourceAsStream("/properties.properties")); 즉, getResourceAsStreamFileInputStream? 장점과 단점?
Thufir

80
  • 원하는 위치 에 파일을 저장할 수 있습니다 . jar 파일에 보관하려면 사용 Class.getResourceAsStream()하거나 ClassLoader.getResourceAsStream()액세스해야합니다. 파일 시스템에 있으면 약간 더 쉽습니다.

  • 내 경험에서 .properties가 더 일반적이지만 모든 확장은 괜찮습니다.

  • 사용하여 파일을로드 Properties.load전달, InputStream또는 StreamReader자바 6을 사용하는 경우 당신이 경우 ( 하는 자바 6을 사용하여, 나는 아마 UTF-8과 사용하십시오 Reader스트림에 대한 기본 설정 대신 ISO-8859-1 인코딩. )

  • 그것은을 반복 처리 당신은 정상을 반복 원하는만큼 Hashtable(이 Properties사용 예에서 파생) keySet(). 또는에서 반환 한 열거 형을 사용할 수 있습니다 propertyNames().


1
고마워 존, 다음 나는 내가 joda에 뭔가를 찾고있을 것입니다 알고 당신도 그에 대답합니다.
Flame

27

속성 파일을 Foo 클래스와 동일한 패키지에 넣으면 쉽게로드 할 수 있습니다

new Properties().load(Foo.class.getResourceAsStream("file.properties"))

속성이 해시 테이블을 확장하면 해시 테이블에서와 같은 방식으로 값을 반복 할 수 있습니다.

* .properties 확장자를 사용하면 편집기 지원을받을 수 있습니다. 예를 들어 Eclipse에는 특성 파일 편집기가 있습니다.


5
당신 이것을 있습니다 -그러나 나는 같은 패키지에 속성 파일을 저장하는 것을 싫어합니다. 결국 응용 프로그램의 모든 위치에 속성 파일이 분산됩니다. 모든 속성 파일을 앱의 루트에 저장하고 "class.getResourceAsStream ("\ file.properties ")"또는 다른 알려진 위치에로드하는 것이 좋습니다.
Nate

네이트, 맞아 그러나 일부 시나리오에서는 배치 된 위치를 알 수 없습니다 (예 : 특정 구성 요소의 모든 것이 일부 아카이브에 번들 됨). 그러한 경우 '클래스가있는 곳이면 어디든 그 클래스와 함께있다'고 말하는 것이 매우 편리 할 수 ​​있습니다. 또한 파일이 완전히 퍼지지 않도록 모든 속성 파일에 단일 구성 패키지를 사용할 수 있습니다.
Fabian Steeg

1
Fabian, 두 경우 모두 내 의견과 함께 작동합니다. 파일 시스템이 아니라 클래스 경로를 기반으로합니다.
Nate

2
Nate의 예제를 사용하려는 사람은 백 슬래시를 슬래시로 바꿔야합니다. 따라서이 경우 'class.getResourceAsStream ( "/ file.properties")'
hash_collision

12

properties파일 을 만들고 읽는 방법에는 여러 가지가 있습니다 .

  1. 파일을 동일한 패키지에 저장하십시오.
  2. .properties확장 프로그램을 추천 하지만 자신의 것을 선택할 수 있습니다.
  3. 사용은에있는 클래스 논제 java.util패키지 => Properties, ListResourceBundle, ResourceBundle클래스.
  4. 속성을 읽으려면 반복자 또는 열거자를 사용하거나 직접 메소드 Properties또는 java.lang.System클래스를 사용하십시오.

ResourceBundle 수업:

 ResourceBundle rb = ResourceBundle.getBundle("prop"); // prop.properties
 System.out.println(rb.getString("key"));

Properties 수업:

Properties ps = new Properties();
ps.Load(new java.io.FileInputStream("my.properties"));

안녕 AVD, 왜 우리는 .properties확장 만 필요 합니까? '.txt'확장에 어떤 문제가 있습니까? 도와주세요.
atish shimpi

@atishshimpi 속성 유형과 작업하는 동안 필요하지만 ResourceBundle을위한 필수되지 않음 - doc- 읽어 docs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html
adatapost

5

속성 파일이로드됩니다.

Properties prop = new Properties();
InputStream stream = ...; //the stream to the file
try {
  prop.load(stream);
} finally {
  stream.close();
}

모든 구성 파일이있는 디렉토리에 .properties 파일을 저장하는 데 사용하지만 액세스하는 클래스와 함께 사용하지는 않지만 여기에는 제한이 없습니다.

이름을 ... 나는 자세한 정보를 위해 .properties를 사용하고 싶지 않다면 .properties로 이름을 지정해야한다고 생각하지 않습니다.


그러나 특성 파일의 일부 "확장자"는 .properties 확장자 (예 : I18N에서 사용되는 ResourceBundle)를 가정합니다.
Nate

5

예:

Properties pro = new Properties();
FileInputStream in = new FileInputStream("D:/prop/prop.properties");
pro.load(in);
String temp1[];
String temp2[];
// getting values from property file
String username = pro.getProperty("usernamev3");//key value in prop file 
String password = pro.getProperty("passwordv3");//eg. username="zub"
String delimiter = ",";                         //password="abc"
temp1=username.split(delimiter);
temp2=password.split(delimiter);

속성 파일이 3 개인 경우 어떻게합니까?
Angelina

4

속성이 레거시가되었습니다. 환경 설정 클래스는 속성보다 선호됩니다.

기본 설정 데이터의 계층 적 콜렉션에있는 노드입니다. 이 클래스를 통해 응용 프로그램은 사용자 및 시스템 환경 설정 및 구성 데이터를 저장하고 검색 할 수 있습니다. 이 데이터는 구현 종속 백업 저장소에 지속적으로 저장됩니다. 일반적인 구현에는 플랫 파일, OS 특정 레지스트리, 디렉토리 서버 및 SQL 데이터베이스가 포함됩니다. 이 클래스의 사용자는 백업 저장소의 세부 사항에 대해 걱정할 필요가 없습니다.

문자열 기반 키-값 쌍인 속성과 달리이 Preferences클래스에는 기본 설정 데이터 저장소에서 기본 데이터를 가져오고 넣는 데 사용되는 몇 가지 메소드가 있습니다. 다음 유형의 데이터 만 사용할 수 있습니다.

  1. 부울
  2. 더블
  3. 흙손
  4. int
  5. 바이트 배열

특성 파일을로드하려면 절대 경로를 제공하거나 getResourceAsStream()특성 파일이 클래스 경로에있는 경우 사용 하십시오.

package com.mypack.test;

import java.io.*;
import java.util.*;
import java.util.prefs.Preferences;

public class PreferencesExample {

    public static void main(String args[]) throws FileNotFoundException {
        Preferences ps = Preferences.userNodeForPackage(PreferencesExample.class);
        // Load file object
        File fileObj = new File("d:\\data.xml");
        try {
            FileInputStream fis = new FileInputStream(fileObj);
            ps.importPreferences(fis);
            System.out.println("Prefereces:"+ps);
            System.out.println("Get property1:"+ps.getInt("property1",10));

        } catch (Exception err) {
            err.printStackTrace();
        }
    }
}

xml 파일 :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE preferences SYSTEM 'http://java.sun.com/dtd/preferences.dtd'>
<preferences EXTERNAL_XML_VERSION="1.0">
<root type="user">
<map />
<node name="com">
  <map />
  <node name="mypack">
    <map />
    <node name="test">
      <map>
        <entry key="property1" value="80" />
        <entry key="property2" value="Red" />
      </map>
    </node>
  </node>
</node>
</root>
</preferences>

환경 설정 저장소의 내부 에서이 기사 를 살펴보십시오.


3

순서대로 :

  1. 파일을 거의 모든 곳에 저장할 수 있습니다.
  2. 확장이 필요하지 않습니다.
  3. Montecristo는 이것을로드하는 방법을 설명 했습니다. 잘 작동합니다.
  4. propertyNames () 는 반복 할 열거 형을 제공합니다.

2. no extension is necessary,이 진술에 대한 참조를 제공해주십시오. 나는 그것에 혼란스러워한다.
atish shimpi

입력 스트림을 통해 속성을로드 할 수 있습니다. 따라서 속성은 입력 스트림이 어디에서 왔는지 (파일? 소켓?) 알지 못하기 때문에 명명 표준을 적용 할 수 없습니다.
Brian Agnew

3

기본적으로 Java는 애플리케이션의 작업 디렉토리에서 Java를 엽니 다 (이 동작은 실제로 사용되는 OS에 따라 다릅니다). 파일을로드하려면 다음을 수행하십시오.

Properties props = new java.util.Properties();
FileInputStream fis new FileInputStream("myfile.txt");
props.load(fis)

따라서 모든 파일 확장자를 특성 파일에 사용할 수 있습니다. 또한을 사용할 수있는 한 파일을 어느 곳에 나 저장할 수 있습니다 FileInputStream.

관련 참고 사항에서 최신 프레임 워크를 사용하는 경우 프레임 워크는 속성 파일을 여는 추가 방법을 제공 할 수 있습니다. 예를 들어 Spring ClassPathResource은 JAR 파일 내부에서 패키지 이름을 사용하여 속성 파일을로드 하는 을 제공 합니다.

속성을 반복하는 경우 속성이로드되면 java.util.Properties객체에 저장되어 propertyNames()메서드 를 제공합니다 .


3

특성 파일 읽기 및 내용로드 Properties

String filename = "sample.properties";
Properties properties = new Properties();

input = this.getClass().getClassLoader().getResourceAsStream(filename);
properties.load(input);

다음은 A를 반복하는 효율적인 방법입니다 Properties

    for (Entry<Object, Object> entry : properties.entrySet()) {

        System.out.println(entry.getKey() + " => " + entry.getValue());
    }

3

Java 8 에서는 모든 속성을 가져옵니다.

public static Map<String, String> readPropertiesFile(String location) throws Exception {

    Map<String, String> properties = new HashMap<>();

    Properties props = new Properties();
    props.load(new FileInputStream(new File(location)));

    props.forEach((key, value) -> {
        properties.put(key.toString(), value.toString());
    });

    return properties;
}

2

1) 클래스 파일에 속성 파일을 두는 것이 좋지만 프로젝트의 어느 곳에 나 배치 할 수 있습니다.

다음은 클래스 경로에서 속성 파일을로드하고 모든 속성을 읽는 방법입니다.

Properties prop = new Properties();
InputStream input = null;

try {

    String filename = "path to property file";
    input = getClass().getClassLoader().getResourceAsStream(filename);
    if (input == null) {
        System.out.println("Sorry, unable to find " + filename);
        return;
    }

    prop.load(input);

    Enumeration<?> e = prop.propertyNames();
    while (e.hasMoreElements()) {
        String key = (String) e.nextElement();
        String value = prop.getProperty(key);
        System.out.println("Key : " + key + ", Value : " + value);
    }

} catch (IOException ex) {
    ex.printStackTrace();
} finally {
    if (input != null) {
        try {
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2) 속성 파일의 확장자는 .properties입니다.


1

속성을 반복하는 다른 방법은 다음과 같습니다.

Enumeration eProps = properties.propertyNames();
while (eProps.hasMoreElements()) { 
    String key = (String) eProps.nextElement(); 
    String value = properties.getProperty(key); 
    System.out.println(key + " => " + value); 
}

2
정말 죄송합니다. 나는 데이빗의 대답에 코드를 검토하고 그것을 내가 실제로 그의 해결책은 ... 나는 생각한다, 나보다 좋네요 ... 다시 생각 모르겠어요 ... 아주 잘 작동
dertoni

1

나는 작년에이 속성 틀에 글을 썼습니다. 속성을로드하는 여러 가지 방법을 제공하며 강력하게 입력해야합니다.

한 번 봐 가지고 http://sourceforge.net/projects/jhpropertiestyp/을

JHPropertiesTyped는 개발자에게 강력한 형식의 속성을 제공합니다. 기존 프로젝트에 쉽게 통합 할 수 있습니다. 속성 유형에 대한 큰 시리즈에서 처리합니다. 속성 IO 구현을 통해 속성을 한 줄 초기화하는 기능을 제공합니다. 개발자에게 고유 한 속성 유형 및 속성 io를 만들 수있는 기능을 제공합니다. 위의 스크린 샷과 같은 웹 데모도 제공됩니다. 속성을 사용하도록 선택한 경우 웹 프런트 엔드에 대한 표준 구현도 있습니다.

완전한 문서, 튜토리얼, javadoc, FAQ 등은 프로젝트 웹 페이지에서 구할 수 있습니다.


0

준비가 된 정적 클래스

import java.io.*;
import java.util.Properties;
public class Settings {
    public static String Get(String name,String defVal){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            FileReader reader = new FileReader(configFile);
            Properties props = new Properties();
            props.load(reader);
            reader.close();
            return props.getProperty(name);
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
            return defVal;
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
            return defVal;
        } catch (Exception ex){
            logger.error(ex);
            return defVal;
        }
    }
    public static Integer Get(String name,Integer defVal){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            FileReader reader = new FileReader(configFile);
            Properties props = new Properties();
            props.load(reader);
            reader.close();
            return Integer.valueOf(props.getProperty(name));
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
            return defVal;
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
            return defVal;
        } catch (Exception ex){
            logger.error(ex);
            return defVal;
        }
    }
    public static Boolean Get(String name,Boolean defVal){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            FileReader reader = new FileReader(configFile);
            Properties props = new Properties();
            props.load(reader);
            reader.close();
            return Boolean.valueOf(props.getProperty(name));
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
            return defVal;
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
            return defVal;
        } catch (Exception ex){
            logger.error(ex);
            return defVal;
        }
    }
    public static void Set(String name, String value){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            Properties props = new Properties();
            FileReader reader = new FileReader(configFile);
            props.load(reader);
            props.setProperty(name, value.toString());
            FileWriter writer = new FileWriter(configFile);
            props.store(writer, Variables.SETTINGS_COMMENT);
            writer.close();
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
        } catch (Exception ex){
            logger.error(ex);
        }
    }
    public static void Set(String name, Integer value){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            Properties props = new Properties();
            FileReader reader = new FileReader(configFile);
            props.load(reader);
            props.setProperty(name, value.toString());
            FileWriter writer = new FileWriter(configFile);
            props.store(writer,Variables.SETTINGS_COMMENT);
            writer.close();
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
        } catch (Exception ex){
            logger.error(ex);
        }
    }
    public static void Set(String name, Boolean value){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            Properties props = new Properties();
            FileReader reader = new FileReader(configFile);
            props.load(reader);
            props.setProperty(name, value.toString());
            FileWriter writer = new FileWriter(configFile);
            props.store(writer,Variables.SETTINGS_COMMENT);
            writer.close();
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
        } catch (Exception ex){
            logger.error(ex);
        }
    }
}

여기 샘플 :

Settings.Set("valueName1","value");
String val1=Settings.Get("valueName1","value");
Settings.Set("valueName2",true);
Boolean val2=Settings.Get("valueName2",true);
Settings.Set("valueName3",100);
Integer val3=Settings.Get("valueName3",100);

0

다음과 같은 방법으로 특성 파일을로드 할 수 있습니다.

InputStream is = new Test().getClass().getClassLoader().getResourceAsStream("app.properties");
        Properties props =  new Properties();
        props.load(is);

그리고 다음과 같은 람다 식을 사용하여 맵을 반복 할 수 있습니다.

props.stringPropertyNames().forEach(key -> {
            System.out.println("Key is :"+key + " and Value is :"+props.getProperty(key));
        });

0

내 의견으로는 다음과 같이 매우 간단하게 할 수있을 때 다른 방법은 더 이상 사용되지 않습니다.

@PropertySource("classpath:application.properties")
public class SomeClass{

    @Autowired
    private Environment env;

    public void readProperty() {
        env.getProperty("language");
    }

}

너무 간단하지만 최선의 방법이라고 생각합니다 !! 즐겨

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.