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

한빛출판네트워크

IT/모바일

자바 환경에서 하나의 프로그래밍 표준출력으로 내보내는 Stream을 이용하기 위한 방법

한빛미디어

|

2003-03-06

|

by HANBIT

12,077

저자: 임영규

하나의 프로세스가 표준 출력을 사용하여 그 결과를 내 보낼 경우 이것을 자바 프로그램에서 읽어 들이는 방법을 본 기사에서 제시하고자 한다. 일반적으로 콘솔(consol)에 대한 입출력은 System 클래스에서 담당하며, 여기에는 i, out, err 이라는 특별한 정의 필드가 있다. 본 기사에서 우리는 out의 출력을 다른 프로세스의 입력으로 사용하는 방법에 대해 알아볼 것이다. 자바 환경에서 하나의 프로그램이 표준 출력으로 내 보내는 Stream을 이용하려면 아래와 같은 몇 가지 클래스들을 이용해야 한다.
  • 사용자 클래스
  • Process 클래스
  • System 클래스
  • Runtime 클래스
  • Application 클래스
사용자 클래스는 얻고자 하는 결과를 위해 데몬으로 사용하기 위한 클래스이며, Process 와 Runtime 클래스는 새로 생성되는 프로세스 클래스이다. Application 클래스는 최종 결과를 얻기 위한 클래스이다.

표준 출력을 입력으로 받아 오는 과정을 예를 들어보자. 다음 프로그램은 자바 환경변수들을 구하는 프로그램이다. 이러한 최종 결과를 얻기 위한 방법을 그림으로 도시하면 아래 [그림 1]과 같다.


[그림 1] Data Flow of two process

[그림 2]는 os 환경 값을 불러온 것이고 [그림 3]은 자바 환경 값을 불러온 것이다. 또 [그림 4]는 썬 환경 값을 불러온 것이다.


[그림 2] OS 환경 값


[그림 3] 자바 환경 값


[그림 4] 썬 환경 값

이러한 환경 값을 이용하기 위한 절차를 그림으로 나타내면 아래 [그림 5]와 같다. 먼저 OS환경에서 getOS 클래스가 실행이 되면, 내부적으로 처리 요구를 원하는 선택사항(Request value : java, os, sun, all)을 처리하여 새로운 프로세스인 getOSM(Daemon)을 Thread로 동작 시키게 된다. exec Method는 Thread로 하나의 프로세스를 실행 시키는 것이다. 이때 getOSM이 Thread로 실행된다.


[그림 5] Processor Flow

getOSM은 JVM에 환경 변수를 요구나 환경 변수값 설정, 그 결과를 consol로 출력한다. 이때 getOS에서는 이 출력을 InputStream으로 받아 들여서 마치 하나의 Piped File로 결과를 읽어 들이게 된다. 그리고 그 결과를 consol로 출력한다. 물론 단순히 하나의 프로세스, 즉 getOS에서 곧바로 그 결과를 얻어 올 수도 있다. 그러나 본 기사에서 제시하고자 하는 것은 표준 출력을 다른 Stream의 입력으로 처리하기 위함이기 때문에 아래 그림과 같이 실험한 것이다.

아래의 getOS에 사용된 프로그램 코드를 보고 자세히 그 사용을 알아보자.
/*
System Resource access program
Program: getOS.java needs getOSM.java
Summary:
        환경 값을 출력 하는 자바 프로그램을 동작 시켜 그 결과를 얻어 온다. 
        자바의 많은 환경을 참조하고, 필요에 따라 그 값을 변경 할 수 있다.

Author : 임영규
Date   : 2003/3/1
*/

import	java.util.*;
import	java.io.*;

class getOS
{
   public getOS()
   {      
   }

   public void result(String ag[])
   {
     // 셀 환경을 하나 만든다.(OS측면에서는 하나의 Thread를 생성 함
     Runtime run = Runtime.getRuntime();
     // 수행할 프로세스를 지정한다.
     Process ps;

     String query = ag[0];
     BufferedReader in;

     System.out.println("Result of Java Information ...... Lim.y.k Made");

     // 게비지 콜렉터를 실행 합니다.
     run.gc();

     // 메모리 량을 출력합니다.
     System.out.println("Free Mem = " + run.freeMemory() + "byte");
     System.out.println("JVM total Mem = " + run.totalMemory() + "byte");

     // 프로세스를 바로 잡기 위한 command 생성
     
     String comm;
     if (query.equals("all"))
        comm = "java getOSM ";
     else
        comm = "java getOSM " + query;

     try
     {
        // 지정한 자바 프로그램(환경변수 출력 용)을 실행 함
        // 생성한 Thread로 명령을 수행 함
        ps =  run.exec(comm);

        // System.out으로 나가는 출력을 입력으로 받아 들이기 위함
        in = new BufferedReader(new InputStreamReader(ps.getInputStream()));
        int len = query.length();

        String res,dat,result;
       
        // 출력 파일을 다 읽어 들임
        while((res= in.readLine()) != null)
        {
           result=res;

           // 읽어들인 자료가 query보다 작으면 다음 라인 읽음
           if (res.length() < len) continue;


           // Filtering 하기 위한 조건을 찾아 옮
           // os, java, sun 등등, 그리고 출력 함
           dat = res.substring(0, len);
           if (query.equals("all") || dat.equals(query))
               System.out.println(result);
        }
     } catch(Exception e)
     {
     }
   }

   // Program entry point
   public static void main(String ag[])
   {
       new getOS().result(ag);
   }
}
이것으로 우리는 표준 출력을 다른 파일의 입력 Stream으로 사용하기 위한 방법과 자바의 환경 값을 읽어 처리하는 방법에 대하여 알아보았다. 이제부터는 하나의 파일을 읽어 들여 이것을 곧바로 다른 파일로 ReDirection하는 방법을 알아보자. 이 방법은 콘솔 출력을 파일의 입력 Stream으로 바로 사용하기 위한 방법이다.
/*
System Redirection make file with consol output
  ; It seems like file copy utility
Program: Redirection.java 
Original : Thinking Java 2nd edition, p 604
          Bruce Eckel President, Mindview, Inc

Summary:
   환경 값을 출력 하는 자바 프로그램을 동작 시켜 그 결과를 얻어 온다. 
   자바의 많은 환경을 참조하고, 필요에 따라 그 값을 변경 할 수 있다.

Author : 임영규
Date   : 2003/3/1
*/

public class Redirction
{
   public static void main(String arg[])
   {
      // open a file Redirection.java
      BufferedInputStream in = new BufferedInputStream
                                  (new FileInputStream("Redirection.java")));
      // open a file to write
      BufferedOutputStream in = new BufferedOutputStream
                                  (new FileOutputStream("Redirection2.java")));

      // 입력과 출력을 표준 I/O로 지정하기 위하여
      // System 클래스 참조
      System.setIn(in);
      System.setOut(out);
      System.setErr(out);

      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      String s;
while((s = in.readLine()) != null)
   System.out.println(s);

// out을 출력 Stream으로 사용하기 위해 Setting했으므로
out.close();
}
이로서 표준 출력을 다른 파일의 입력 Stream으로 사용하는 원리와 예제를 들어 보았다. 순수 PIPE 구현에 대한 연구는 다음 과제로 남긴다. 참고로 본 논문에서 사용한 Daemon 프로그램인 getOSM을 싣는다
/*
System Resource Main access program
Summary:
   환경 값을 출력 하는 자바 프로그램을 동작 시켜 그 결과를 얻어 온다. 
자바의 많은 환경을 참조하고, 필요에 따라 그 값을 변경 할 수 있다.

Author : 임영규
Date   : 2003/3/1
*/

import	java.util.*;
import	java.io.*;

class getOSM
{
   public getOSM()
   {      
   }

   public void result(String ag[])
   {

      String osName, osVersion, osArch;
      System.getProperties().list(System.out);
/* 
      reference programming below
      Standalone programming You Make

      {
         osVersion = System.getProperty("os.version");
         osArch = System.getProperty("os.arch");
         osName = System.getProperty("os.name");

         System.out.println("OS : " + osName);
         System.out.println("OS ver : " + osVersion);
         System.out.println("OS CPU : " + osArch);
      }   
*/
   }

   // Absolutely Need main function,
   // which need that a single thread on exec method

   public static void main(String ag[])
   {
       new getOSM().result(ag);
   }
}
TAG :
댓글 입력
자료실

최근 본 상품0