메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

자바로 윈도우 운영체제의 정보를 알아내자!

한빛미디어

|

2003-12-03

|

by HANBIT

16,738

저자: 김영익

"자바 프로그래머"라면 한번쯤 고민하게 되는 부분이 있다. 그 중 하나가 자바 API가 지원하지 못하는 부분에 대한 것이다. 예를 들어 자바 API로는 네트워크 인터페이스 카드(NIC, 흔히 랜 카드라고 부른다)의 맥 어드레스(MAC Address)를 알아 낼 방법이 없다. 결국 JNI(Java Native Interface)를 사용하거나 다른 꽁수(?)를 찾아내곤 한다. 본인이 생각하기에는 두 방법 모두 시원스런 방법은 아니라서 상당히 거시기한 느낌이다. JNI를 사용하자니 C/C++ 코드를 사용하여 플랫폼에 제한적이 되어버리고… 꽁수를 사용하자니 안 먹히는 경우가 너무 많고…

어쨌거나 다른 해결 방법이 없다면 둘 중 하나를 사용해야 한다. 두 가지 중에서 본인이 많이 사용하는 방법은 꽁수를 사용하는 방법이다. 여기서 말하는 꽁수란 원하는 결과를 얻을 수 있는 외부 프로세스를 실행시키고 그 결과를 받아내어 필요한 부분만 얻어내는 방법을 사용하는 것이다. 이번 기사에서는 윈도우 XP 운영체제의 시스템 비밀스런(?) 정보를 얻어내는 자바 프로그램을 만들어 보도록 하자.
※ 주의: 본 기사의 모든 내용은 윈도우 XP 프로페셔널에서만 동작한다. 윈도우 XP 홈에디션에는 시스템 정보를 얻어내는 프로그램(systeminfo.exe)이 지원되지 않는다.
무엇을 만들 것인가요?

일단 우리가 작성할 자바 프로그램을 결과부터 살펴보자. 자신의 컴퓨터가 윈도우 XP 프로페셔널이고 자바 프로그램이 실행되도록 환경이 설정되어 있다면, 잠시 후 아래와 같은 결과가 나타난다.


[그림 1]

본인도 사무실 동료에게 보내서 실행하게 해보았다. 그리고 동료는 잠시 동안 생각하더니, 어떻게 자바 프로그램으로 이런 정보를 얻어 올 수 있냐고 무척이나 궁금해 했다. 잠시 우쭐대다가 방법을 알려 주었는데 그 동료는 알고 나니 별거 아니다라는 눈치였다. 어쨌거나 지금부터 그 비법을 공개한다.

무엇을 만들 것인가요?

일단 화면에 도스창을 하나 띄워보자. 그런 후, "systeminfo"라고 입력하면 아래와 같은 화면이 나올 것이다. 윈도우 XP 프로페셔널에 이런 프로그램이 있다는 사실은 본인도 이 프로그램을 작성하면서 처음 알게 된 것이다. 자세한 세부 사항은 "systeminfo /?"라고 입력하여 도움말을 참고하도록 하자.


[그림 2]

화면에 보이는 결과를 살펴보면 의외로 많은 사실들을 알 수 있다. 운영체제의 자세한 버전이나 사용자 정보, 실제 메모리 정보, 운영체제에 적용된 패치 등등… 이제부터는 이 정보들을 이용하여 자신이 원하는 몇 가지만을 보여주는 간단한 프로그램을 만들어보자.

자바에서 외부 프로그램을 실행하자!

이 프로그램의 핵심은 자바 프로그램 내에서 외부 프로그램을 실행시키고 그 결과를 받아내는 것이다. 이미 알고 있는 사람들에게는 아주 쉬운 일이지만 한번도 사용해보지 않았다면 이번 기회에 익혀두도록 하자. 나중에 두고 두고 써먹을 수 있는 프로그램 기법이 될 것이다(실제로 필자도 위기가 닥칠 때마다 이용해서 아주 유용하게 사용하고 있다). 아래 자바 메소드는 실행할 외부 프로그램의 이름을 스트링으로 지정하고 그 프로그램을 실행 후에 표준 출력과 표준 에러를 받아 내는 것이 전부이다.
public void run() {
        Runtime runtime = Runtime.getRuntime();
        Process process = null;

        try {
            // this.command = "systeminfo.exe";
            process = runtime.exec(this.command); // 외부 프로그램 실행
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }

        // 표준 출력
        InputStream standardOutput = process.getInputStream();
        // 표준 에러
        InputStream standardError = process.getErrorStream();

        InputStreamReader ir = new InputStreamReader(standardOutput);
        InputStreamReader ow = new InputStreamReader(standardError);

        BufferedReader outReader = new BufferedReader(ir);
        BufferedReader errorReader = new BufferedReader(ow);

        StringBuffer stdout = new StringBuffer();
        StringBuffer stderr = new StringBuffer();
        String line = null;
        try {
            // 루프를 돌면서 퓨준 출력과 표준 에러를 계속 받아낸다
            while ( (line = outReader.readLine()) != null) {
                stdout.append(line).append("\n");
            }
            while ( (line = errorReader.readLine()) != null) {
                stderr.append(line).append("\n");
            }
            standardOutput.close();
            standardError.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
        result.setStdout(stdout.toString()); // 이 결과를 나중에 사용한다
        result.setStderr(stderr.toString());
    }
위의 코드 마지막 부분에 나중에 사용할 결과를 지정하는 부분이 있다. 그 결과를 이용해서 원하는 정보만 가려내는 코드는 다음과 같다.
        String result = pRunner.result.getStdout();
        StringTokenizer st = new StringTokenizer(result, "\n");
        while (st.hasMoreElements()) {
            String line = (String)st.nextElement();
            if (line.startsWith("호스트 이름")) {
                addSysInfo(line);
            }
            if (line.startsWith("OS 이름")) {
                addSysInfo(line);
            }
            if (line.startsWith("등록된 소유자")) {
                addSysInfo(line);
            }
            if (line.startsWith("Product ID")) {
                addSysInfo(line);
            }
            if (line.startsWith("System Up Time")) {
                addSysInfo(line);
            }
        }
원하는 정보를 모두 얻었다면 이제 GUI로 아름답게 보여주는 일만 남았다. 이 부분에서는 여러 분들이 직접 원하는 형태대로 만들어보기 바란다. 물론 완전한 소스 코드는 별도의 파일(systeminfo.zip)에서 제공할 것이다. 간단한 클래스 3개로 구성되므로 무리 없이 분석 가능하며 압축 파일을 풀면 run.bat 파일이 있다. 이 파일을 실행하면 간단히 실행할 수 있을 것이다.

마치면서

지금까지 윈도우 운영체제의 정보를 알아내는 간단한 자바 프로그램을 작성해보았다. 물론 순수 자바 기능으로 구현한 것이 아니기 때문에 "플랫폼에 무관하게 동작"하는 자바의 기본 철학에는 위배되지만 이제 여러분은 자바의 한계를 뛰어 넘는 하나의 비법(?)을 알게 된 것이다. 필자가 앞에서도 언급했던 것처럼 위기에 부딪힐 때마다 이 방법을 사용해 좋은 결과를 얻었다고 했는데, 가장 대표적인 예가 컴퓨터의 IP 주소와 MAC 주소를 얻어내는 것이었다. 초기의 JDK 1.4.X 버전에는 버그 때문에 한글로 컴퓨터 이름이 되어 있는 경우 IP 주소를 얻을 수가 없었는데, 이때 이와 같은 방법을 사용해서 문제를 간단히 해결했다.

여러분에게도 어려움이 있는가? 있다면 곰곰히 생각해보자! 이런 뜻밖의 꽁수가 여러분을 수렁에서 건져낼지도 모르니까...
TAG :
댓글 입력
자료실

최근 본 상품0