Programing

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

lottogame 2020. 4. 26. 20:58
반응형

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


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

질문 :

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

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);
}

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

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

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

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


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

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

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

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


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"));

속성 파일이로드됩니다.

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

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

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


예:

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);

순서대로 :

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

기본적으로 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()메서드 를 제공합니다 .


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

기본 설정 데이터의 계층 적 콜렉션에있는 노드입니다. 이 클래스를 통해 응용 프로그램은 사용자 및 시스템 환경 설정 및 구성 데이터를 저장하고 검색 할 수 있습니다. 이 데이터는 구현 종속 백업 저장소에 지속적으로 저장됩니다. 일반적인 구현에는 플랫 파일, 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>

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


특성 파일 읽기 및 내용로드 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());
    }

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입니다.


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;
}

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

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

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

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

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

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


준비된 정적 클래스

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);

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

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));
        });

참고 URL : https://stackoverflow.com/questions/1318347/how-to-use-java-property-files

반응형