Java Language
속성 클래스
수색…
소개
properties 객체는 key와 value 쌍을 모두 문자열로 포함합니다. java.util.Properties 클래스는 Hashtable의 서브 클래스입니다.
속성 키를 기반으로 속성 값을 가져 오는 데 사용할 수 있습니다. Properties 클래스는 속성 파일에서 데이터를 가져 와서 데이터를 속성 파일에 저장하는 메서드를 제공합니다. 또한, 시스템의 속성을 가져 오는 데 사용할 수 있습니다.
특성 파일의 장점
정보가 등록 정보 파일에서 변경되면 다시 컴파일 할 필요가 없습니다. 정보가 다음과 같이 변경된 경우
통사론
- 특성 파일에서 :
- 키 = 값
- #논평
비고
Properties 객체는 규칙에 따라 키와 값이 String 인 Map 입니다. Map의 메소드를 사용하여 데이터에 액세스 할 수는 있지만 일반적으로보다 안전한 유형의 getProperty , setProperty 및 stringPropertyNames 메소드 가 대신 사용됩니다.
등록 정보는 간단한 텍스트 파일 인 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