Java/Tip & Tech2009. 12. 11. 13:20

많은 분들이 잘 아시겠지만 Windows에는 레지스트리라는 것이 있습니다.


윈도우 레지스트리(Windows Registry)
는 마이크로소프트 윈도 32/64비트 버전과 윈도 모바일 운영 체제의 설정과 선택 항목을 담고 있는 데이터베이스이다.



자바 프로그램 개발시에 Windows Registry 정보를 읽어와야 할 필요가 있을 경우가 있습니다.

필자도 프로그램을 만들다가 Registry 정보를 읽어올 필요가 있어서 자바에서 가능한 방법을 찾아보게 되었습니다.

자바 API를 찾아보니 JDK1.4 버전부터 포함되어 있는 Preferences라는 관련 클래스가 있었습니다.

대략 클래스 정의 문서를 쭈욱 보고 나서 예제 프로그램을 만들어 보았습니다.


import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;

public class TestGetRegInfoByPreferences {
	public static void main(String args[]) {
		final Preferences userRoot = Preferences.userRoot();
		// final Preferences systemRoot = Preferences.systemRoot();

		System.out.println("userRoot.absolutePath() : " + userRoot.absolutePath());
		System.out.println("userRoot.name() : " + userRoot.name());
		System.out.println("userRoot.toString() : " + userRoot.toString());
		System.out.println("userRoot.isUserNode() : " + userRoot.isUserNode());

		try {
			System.out.println("userRoot.childrenNames()");
			String[] childrenNames = userRoot.childrenNames();
			int lenChildrenNames = childrenNames.length;
			for (int i = 0; i < lenChildrenNames; i++)
				System.out.println("childrenNames[" + i + "] : " + childrenNames[i]);

			System.out.println("userRoot.keys()");
			String[] keys = userRoot.keys();
			int lenKeys = keys.length;
			for (int i = 0; i < lenKeys; i++)
				System.out.println("keys[" + i + "] : " + keys[i]);
		} catch (BackingStoreException bse) {
			bse.printStackTrace();
		}
	}
}


실행을 해보니 결과가 참 암담했습니다.

하위에 아무런 children이나 key가 없는데 과연 이것이 "/"라고 할 수 있는 것일까요?

userRoot.absolutePath() : /
userRoot.name() :
userRoot.toString() : User Preference Node: /
userRoot.isUserNode() : true
userRoot.childrenNames()
userRoot.keys()


일단 그래도 포기하지 않고 Windows Registry에 정보를 입력할 수 있는 소스를 만들어 보았습니다.


import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;

public class TestPutRegInfoByPreferences {

	public static void main(String[] args) {
		final Preferences userRoot = Preferences.userRoot();
		// final Preferences systemRoot = Preferences.systemRoot();

		try {
			userRoot.node("Java");
			userRoot.put("Version", "1.6.0");
			userRoot.flush();
		} catch (BackingStoreException bse) {
			bse.printStackTrace();
		}
	}
}


결과는 아래와 같습니다.



이거 userRoot라는 곳의 위치가 혹시???

그래서 인터넷을 살펴보고는 아래와 같은 사실을 알게되었습니다.

Preferences.systemRoot() 위치 = HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

Preferences.userRoot() 위치 = HKEY_CURRENT_USER\Software\JavaSoft\Prefs



"Administrator" 계정을 사용하고 있더라도 프로그램 쪽에서 운영체제에 대한 접근을

무조건 다 허용하지는 말아야할 필요가 있기는 하지만, 이건 뭐 장난하는 것도 아니고...

아무튼 Preferences 클래스는 거의 쓸 수가 없다는 판단으로

자바를 통해 WIndows Registry 접근을 할 수 있는 다른 방법을 찾아 보았습니다.

2편에서 계속됩니다.

2009/12/11 - [Java/Tip & Tech] - [Java]Java로 Windows Registry 정보를 가져오기...2편

Posted by Huikyun