Properties는 HashMap의 구버전인 Hashtable을 상속받아 구현한 것으로, Hashtable은 키와 값을 (Object, Object)의 형태로 저장하는데 비해 Properties는 (String, String)의 형태로 저장하는 보다 단순화된 컬렉션클래스이다.
주로 애플리케이션의 환경설정과 관련된 속성을 저장하는데 사용되며 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공한다. 그래서 간단한 입출력은 Properties를 활용하면 몇 줄의 코드로 쉽게 해결될 수 있다.
메서드 | 설명 |
Properties() | Properties객체를 생성한다. |
Properties(Properties defaults) | 지정된 Properties에 저장된 목록을 가진 Properties객체를 생성한다. |
String getProperty(String key) | 지정된 키의 값을 반환한다. |
String getProperty(String key, String defaultValue) | 지정된 키의 값을 반환한다. 키를 못찾으면 defaultValue를 반환한다. |
void list(PrintStream out) | 지정된 PrintStream에 저장된 목록을 출력한다. |
void list(PrintWriter out) | 지정된 PrintWriter에 저장된 목록을 출력한다. |
void load(InputStream inStream) | 지정된 InputStream으로부터 목록을 읽어서 저장한다. |
void load(Reader reader) | 지정된 Reader으로부터 목록을 읽어서 저장한다. |
void loadFromXML(InputStream in) | 지정된 InputStream으로부터 XML문서를 읽어서, XML문서에 저장된 목록을 읽어다 담는다.(load & store) |
Enumeration propertyNames() | 목록의 모든 키가 담긴 Enumeration을 반환한다. |
void save(OutputStream out, String header) | deprecated 되었으므로 store()를 사용하자 |
Object setPorperty(String key, String value) | 지정된 키와 값을 저장한다. 이미 존재하는 키면 새로운 값으로 바꾼다. |
void store(OutputStream out, String comments) | 저장된 목록을 지정된 OutputStream에 출력한다. comments는 목록에 대한 주석으로 저장된다. |
void store(Writer writer, String comments) | 저장된 목록을 지정된 Writer에 출력한다. comments는 목록에 대한 주석으로 저장된다. |
void storeToXML(OutputStream os, String comment) | 저장된 목록을 지정된 출력스트림에 XML문서로 출력한다. comment는 목록에 대한 주석으로 저장된다. |
void storeToXML(OutputStream os, String comment, String encoding) | 저장된 목록을 지정된 출력스트림에 해당 인코딩의 XML문서로 출력한다. comment는 목록에 대한 주석으로 저장된다. |
Set string PropertyNames() | Properties에 저장되어 있는 모든 키를 Set에 담아서 반환한다. |
import java.util.*;
class PropertiesEx1 {
public static void main(String[] args) {
Properties prop = new Properties();
// prop에 키와 값을 저장한다.
prop.setProperty("timeout","30");
prop.setProperty("language","kr");
prop.setProperty("size","10");
prop.setProperty("capacity","10");
// prop에 저장된 요소들을 Enumeration을 이용해서 출력한다.
Enumeration e = prop.propertyNames();
while(e.hasMoreElements()) {
String element = (String) e.nextElement();
System.out.println(element + " = " + prop.getProperty(element));
}
System.out.println();
prop.setProperty("size","20"); // size의 값을 20으로 변경
System.out.println("size = " + prop.getProperty("size"));
System.out.println("capacity = " + prop.getProperty("capacity","20"));
System.out.println("loadfactor = " + prop.getProperty("loadfactor","0.75"));
System.out.println(prop); // prop의 저장된 요소 출력
prop.list(System.out); // prop에 저장된 요소들을 화면에 출력
}
}
Properties의 기본적인 메서드를 이용해서 저장하고 읽어오고 출력하는 방법을 보여주는 간단한 예제이다. 데이터를 저장하는데 사용되는 setProperty()는 기존에 같은 키로 저장된 값이 있는 경우 그 값을 Object 타입으로 반환하며, 그렇지 않을 때는 null을 반환한다.
getProperty()는 Properties에 저장된 값을 읽어오는 일을 하는데, 만일 읽어오려는 키가 존재하지 않으면 지정된 기본값을 반환한다.
Properties는 Hashtable을 상속받아 구현한 것이라 Map의 특성상 저장순서를 유지하지 않기 때문에 예제의 결과에 출력된 순서가 저장순서와는 무관하다는 것을 인지하자.
Properties는 컬렉션 프레임워크 이전의 구버전이므로 Iterator가 아닌 Enumeration을 사용한다. 그리고 list 메서드를 사용하면 Properties에 저장된 모든 데이터를 화면 또는 파일에 편리하게 출력할 수도 있다.
System.out 은 화면과 연결된 표준출력으로 System 클래스에 정의된 PrintStream타입의 static 변수이다.
import java.util.*;
import java.io.*;
class PropertiesEx2 {
public static void main(String[] args) {
// commandline에서 inputfile을 지정해주지 않으면 프로그램을 종료한다.
if(args.length != 1) {
System.out.println("USAGEL java PropertiesEx2 INPUTFILENAME");
System.exit(0);
}
Properties prop = new Properties();
String inputFile = args[0];
try {
prop.load(new FileInputStream(inputFile));
} catch (IOException e) {
System.out.println("지정된 파일을 찾을 수 없습니다.");
System.exit(0);
}
String name = prop.getProperty("name");
String[] data = prop.getProperty("data").split(",");
int max = 0, min = 0;
int sum = 0;
for(int i=0;i<data.length;i++) {
int intValue = Integer.parseInt(data[i]);
if(i==0) max = min = intValue;
if(max < intValue) max = intValue;
else if(min > intValue) min = intValue;
sum += intValue;
}
System.out.println("이름 : " + name);
System.out.println("최대값 : " + max);
System.out.println("최소값 : " + min);
System.out.println("합계 : " + sum);
System.out.println("평균 : " + (sum*100.0/data.length)/100);
}
}
외부파일(input.txt)로부터 데이터를 입력받아서 계산결과를 보여주는 예제이다. 외부파일의 형식은 라인단위로 키와 값이 '=' 로 연결된 형태이어야 하며 주석라인은 찻 번째 문자이 '#' 이어야 한다.
정해진 규칙대로만 파일을 작성하면 load()를 호출하는 것만으로 쉽게 데이터를 읽어 올 수 있다. 다만 인코딩 문제로 한글이 깨질 수 있기 때문에 한글을 입력받으려면 아래와 같이 코드를 변경해야 한다.
String name = prop.getProperty("name");
try {
name = new String(name.getBytes("8859_1"), "EUC-KR");
} catch(Exception e) {}
파일로부터 읽어온 데이터의 인코딩을 라틴문자집합(8859_1)에서 한글완성형(EUC_KR 또는 KSC5601)으로 변환해주는 과정을 추가한 것이다.
import java.util.*;
import java.io.*;
class PropertiesEx3 {
public static void main(String[] args) {
properties prop = new Properties();
prop.setProperty("timeout","30");
prop.setProperty("language","한글");
prop.setProperty("size","10");
prop.setProperty("capacity","10");
try {
prop.store(new FileOutputStream("output.txt"), "Properties Example");
prop.storeToXML(new FileOutputStream("output.xml"), "Properties Example");
} catch(IOExeption e) {
e.printStackTrace();
}
}
}
이전 예제와는 반대로 Properties에 저장된 데이터를 store()과 storeToXML()을 이용해서 파일로 저장하는 방법을 보여준다. 여기서도 한글문제가 발생하는데 storeToXML()로 저장한 XML은 Editplus나 Eclipse에서 한글 편집이 가능하므로 데이터에 한글이 포함된 경우 store()보다 storeToXML()을 이용해서 XML로 저장하는 것이 좋다.
import java.util.*;
class PropertiesEx4 {
public static void main(String[] args) {
properties prop = new Properties();
System.out.println("java.version : " + sysProp.getProperty("java.version"));
System.out.println("user.language : " + sysProp.getProperty("user.language"));
sysprop.list(System.out);
}
}
시스템 속성을 가져오는 방법을 보여주는 예제이다. System클래스의 getProperties()를 호출하면 시스템과 관련된 속성이 저장된 Properties를 가져올 수 있다. 이 중에서 원하는 속성을 getProperty()를 통해 얻을 수 있다.
'Java 길찾기 > Java의 정석' 카테고리의 다른 글
[Java] 쓰레드 - volatile (0) | 2022.07.06 |
---|---|
[Java] 컬렉션 프레임워크 - Collections (0) | 2022.07.05 |
[Java] 컬렉션 프레임워크 - TreeMap (0) | 2022.07.01 |
[Java] 컬렉션 프레임워크 - 해싱과 해싱함수 (0) | 2022.06.30 |
[Java] 컬렉션 프레임워크 - HashMap, Hashtable (0) | 2022.06.29 |