수색…


소개

properties 객체는 key와 value 쌍을 모두 문자열로 포함합니다. java.util.Properties 클래스는 Hashtable의 서브 클래스입니다.

속성 키를 기반으로 속성 값을 가져 오는 데 사용할 수 있습니다. Properties 클래스는 속성 파일에서 데이터를 가져 와서 데이터를 속성 파일에 저장하는 메서드를 제공합니다. 또한, 시스템의 속성을 가져 오는 데 사용할 수 있습니다.

특성 파일의 장점

정보가 등록 정보 파일에서 변경되면 다시 컴파일 할 필요가 없습니다. 정보가 다음과 같이 변경된 경우

통사론

  • 특성 파일에서 :
  • 키 = 값
  • #논평

비고

Properties 객체는 규칙에 따라 키와 값이 String 인 Map 입니다. Map의 메소드를 사용하여 데이터에 액세스 할 수는 있지만 일반적으로보다 안전한 유형의 getProperty , setPropertystringPropertyNames 메소드 가 대신 사용됩니다.

등록 정보는 간단한 텍스트 파일 인 Java 특성 파일에 자주 저장됩니다. 해당 형식은 Properties.load 메서드 에서 철저히 문서화됩니다. 요약하자면:

  • 각각의 쌍의 키 / 값이 공백으로 텍스트 라인 (같음 = ), 콜론 ( : 키와 값 사이). equals 또는 콜론에는 그 앞뒤에 공백이있을 수 있으며 무시됩니다.
  • 선행 공백은 항상 무시되며 뒤 공백이 항상 포함됩니다.
  • 백 슬래시는 모든 문자를 이스케이프하는 데 사용할 수 있습니다 (소문자 u 제외).
  • 줄 끝의 백 슬래시는 다음 줄이 현재 줄의 연속임을 나타냅니다. 그러나 모든 행과 마찬가지로 연속 행의 선행 공백은 무시됩니다.
  • 자바 소스 코드와 마찬가지로, \u 와 네 개의 16 진수는 UTF-16 문자를 나타냅니다.

java.util.ResourceBundle과 같은 Java SE 자체의 기능을 포함한 대부분의 프레임 워크는 특성 파일을 InputStream으로로드합니다. InputStream에서 속성 파일을로드 할 때 해당 파일에는 ISO 8859-1 문자 (즉, 0-255 범위의 문자) 만 포함될 수 있습니다. 다른 문자로 표현되어야한다 \u 이스케이프합니다. 그러나 모든 인코딩으로 텍스트 파일을 작성하고 모든 JDK와 함께 제공되는 native2ascii 도구를 사용하여 이스케이프 처리를 수행 할 수 있습니다.

독자적인 코드로 프로퍼티 파일을로드하는 경우는, 대응하는 Charset 에 근거 해 Reader ( InputStreamReader 등)를 작성하고있는 한, 임의의 인코딩으로 할 수 있습니다. 그런 다음 레거시로드 (InputStream) 메서드 대신 load (Reader) 를 사용하여 파일을 로드 할 수 있습니다.

파일 자체가 인코딩을 정의 할 수 있도록하는 간단한 XML 파일에 속성을 저장할 수도 있습니다. 이러한 파일은 loadFromXML 메소드로로드 될 수 있습니다. 이러한 XML 파일의 구조를 설명하는 DTD는 http://java.sun.com/dtd/properties.dtd에 있습니다.

로딩 속성

응용 프로그램과 함께 번들로 제공된 특성 파일을로드하려면 다음을 수행하십시오.

public class Defaults {

    public static Properties loadDefaults() {
        try (InputStream bundledResource =
            Defaults.class.getResourceAsStream("defaults.properties")) {

            Properties defaults = new Properties();
            defaults.load(bundledResource);
            return defaults;
        } catch (IOException e) {
            // Since the resource is bundled with the application,
            // we should never get here.
            throw new UncheckedIOException(
                "defaults.properties not properly packaged"
                + " with application", e);
        }
    }

}

속성 파일주의 사항 : 후행 공백

겉으로보기에는 완전히 똑같은이 두 속성 파일을 자세히 살펴보십시오.

여기에 이미지 설명을 입력하십시오.

단, 그들은 실제로 동일하지 않습니다.

여기에 이미지 설명을 입력하십시오.

(스크린 샷은 Notepad ++입니다.)

후행 공백 이후의 값이 유지된다 lastName"Smith" 첫 번째 경우와 "Smith " 번째 경우이다.

매우 드물게 이것은 사용자가 기대하는 것이며, 이것이 왜 Properties 클래스의 기본 동작인지 추측 할 수 있습니다. 그러나이 문제를 해결하는 향상된 버전의 Properties 을 쉽게 만들 수 있습니다. 다음 클래스 인 TrimmedProperties가이 를 수행합니다. 표준 속성 클래스의 드롭 인 대체품입니다.

import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.Map.Entry;
import java.util.Properties;

/**
 * Properties class where values are trimmed for trailing whitespace if the
 * properties are loaded from a file.
 *
 * <p>
 * In the standard {@link java.util.Properties Properties} class trailing
 * whitespace is always preserved. When loading properties from a file such
 * trailing whitespace is almost always <i>unintentional</i>. This class fixes
 * this problem. The trimming of trailing whitespace only takes place if the
 * source of input is a file and only where the input is line oriented (meaning
 * that for example loading from XML file is <i>not</i> changed by this class).
 * For this reason this class is almost in all cases a safe drop-in replacement
 * for the standard <tt>Properties</tt>
 * class.
 *
 * <p>
 * Whitespace is defined here as any of space (U+0020) or tab (U+0009).
 * * 
 */
public class TrimmedProperties extends Properties {

    /**
     * Reads a property list (key and element pairs) from the input byte stream.
     * 
     * <p>Behaves exactly as {@link java.util.Properties#load(java.io.InputStream) }
     * with the exception that trailing whitespace is trimmed from property values
     * if <tt>inStream</tt> is an instance of <tt>FileInputStream</tt>.
     * 
     * @see java.util.Properties#load(java.io.InputStream) 
     * @param inStream the input stream.
     * @throws IOException if an error occurred when reading from the input stream.
     */
    @Override
    public void load(InputStream inStream) throws IOException {
        if (inStream instanceof FileInputStream) {
            // First read into temporary props using the standard way
            Properties tempProps = new Properties();
            tempProps.load(inStream);
            // Now trim and put into target
            trimAndLoad(tempProps);
        } else {
            super.load(inStream);
        }
    }

    /**
     * Reads a property list (key and element pairs) from the input character stream in a simple line-oriented format. 
     * 
     * <p>Behaves exactly as {@link java.util.Properties#load(java.io.Reader)}
     * with the exception that trailing whitespace is trimmed on property values
     * if <tt>reader</tt> is an instance of <tt>FileReader</tt>.
     * 
     * @see java.util.Properties#load(java.io.Reader) }
     * @param reader the input character stream.
     * @throws IOException if an error occurred when reading from the input stream.
     */
    @Override
    public void load(Reader reader) throws IOException {
        if (reader instanceof FileReader) {
            // First read into temporary props using the standard way
            Properties tempProps = new Properties();
            tempProps.load(reader);
            // Now trim and put into target
            trimAndLoad(tempProps);
        } else {
            super.load(reader);
        }
    }

    private void trimAndLoad(Properties p) {
        for (Entry<Object, Object> entry : p.entrySet()) {
            if (entry.getValue() instanceof String) {
                put(entry.getKey(), trimTrailing((String) entry.getValue()));
            } else {
                put(entry.getKey(), entry.getValue());
            }
        }
    }

    /**
     * Trims trailing space or tabs from a string.
     *
     * @param str
     * @return
     */
    public static String trimTrailing(String str) {
        if (str != null) {
            // read str from tail until char is no longer whitespace
            for (int i = str.length() - 1; i >= 0; i--) {
                if ((str.charAt(i) != ' ') && (str.charAt(i) != '\t')) {
                    return str.substring(0, i + 1);
                }
            }
        }
        return str;
    }
}

속성을 XML로 저장

XML 파일에 속성 저장

특성 파일을 XML 파일로 저장하는 f}은 .properties 파일로 저장하는 f}과 매우 유사합니다. store() 를 사용하는 대신 storeToXML() 합니다.

public void saveProperties(String location) throws IOException{
    // make new instance of properties
    Properties prop = new Properties();
    
    // set the property values
    prop.setProperty("name", "Steve");
    prop.setProperty("color", "green");
    prop.setProperty("age", "23");
    
    // check to see if the file already exists
    File file = new File(location);
    if (!file.exists()){
        file.createNewFile();
    }
    
    // save the properties
    prop.storeToXML(new FileOutputStream(file), "testing properties with xml");
}

파일을 열면 다음과 같이 보입니다.

만든 파일의 스크린 샷

XML 파일에서 속성로드

이제이 파일을 properties load() 하려면 일반 .propeties 파일과 함께 사용하는 load() 대신 loadFromXML() 을 호출해야합니다.

public static void loadProperties(String location) throws FileNotFoundException, IOException{
    // make new properties instance to load the file into
    Properties prop = new Properties();
    
    // check to make sure the file exists
    File file = new File(location);
    if (file.exists()){
        // load the file
        prop.loadFromXML(new FileInputStream(file));
        
        // print out all the properties
        for (String name : prop.stringPropertyNames()){
            System.out.println(name + "=" + prop.getProperty(name));
        }
    } else {
        System.err.println("Error: No file found at: " + location);
    }
}

이 코드를 실행하면 콘솔에 다음과 같은 메시지가 표시됩니다.

age=23
color=green
name=Steve


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow