ILoveCoffee, ILoveJava

InputStream & OutputStream 예제

jeeyong 2008. 1. 28. 18:38

InputStream & OutputStream 클래스는 IO패키지 중에서도 가장 기본이 되는 클래스들입니다. 모든 IO 관련 예제에 50% 정도는 등장한다고 보셔도 좋을 것입니다. 그만큼 중요하고 기본적인 클래스입니다. 예제를 보고 설명을 드리겠습니다.

 

InputOutputStreamTest.java (InputStream, OutputStream을 테스트한 예제)

import java.io.*;

class InputOutputStreamTest {

   public static void main(String args[]) throws IOException {

       System.out.println("아무 글이나 입력하시고 Enter를 쳐주세요");

       System.out.println(" 'S'를 입력하면 프로그램이 종료됩니다.");

       int ch;

       InputStream in = System.in;

       OutputStream out = System.out;

       while((ch=in.read()) != -1) {

          if(ch == 'S') {

             byte[] arr= new byte[4];

             arr[0] = 83;

             arr[1] = 84;

             arr[2] = 79;

             arr[3] = 80;

             out.write(arr);

             out.flush();

             out.close();

             in.close();

             System.exit(-1);

          }

          System.out.println("Char: "+(char)ch+", Available: "+in.available());

       }

   }

}

C:\JavaExample\09>javac InputOutputStreamTest.java

C:\JavaExample\09>java InputOutputStreamTest

아무 글이나 입력하시고 Enter 를 쳐 주세요

 'S'를 입력하면 프로그램이 종료됩니다.

java

Char: j, Available: 5

Char: a, Available: 4

Char: v, Available: 3

Char: a, Available: 2

, Available: 1

Char:

, Available: 0

S

STOP

 

 위의 예제는 가장 기본적인 InputStream & OutputStream을 가지고 입력과 출력을 해본 것입니다.

 

소스를 보면 우선, 키보드로부터 입력받은 값을 읽어오는 InputStream의 객체 in을 생성합니다. java.lang.Object 패키지에 속해있는 System클래스의 멤버 필드인 in은 표준 입력 스트림입니다. 일반적으로 이 스트림은 호스트 환경 또는 사용자가 지정한 키보드 입력 또는 또다른 입력 소스에 대응합니다.

 

n        InputStream in = System.in;

 

OutputStream객체 out을 생성합니다. 역시 System클래스의 멤버 필드인 out을 사용합니다. 이 out은 in에 대비되는 표준 출력 스트림입니다.

 

n        OutputStream out = System.out;

 

생성된 객체 in을 사용하여 InputStream의 멤버메서드인 read()메서드를 호출하여 바이트를 읽어 들입니다.

 

n        while((ch=in.read()) != -1) { }

 

read ()메서드는 바이트값을 읽어들여 int형의 정수값으로 변환시켜 반환시키는 메서드입니다. 읽어들이는 값이 없을 때는 -1을 반환합니다. read()메서드는 while문과 같이 사용하여 바이트가 계속 입력되는지, 입력이 끝났는지를 파악합니다. 그리고 읽어 들인 바이트 값과 비교를 하여, ‘S’가 있다면 프로그램은 바이트 배열을 생성하고, 이 배열을 출력시킵니다. 여기서는 ‘S’, ’T’, ’O’, ’P’를 배열로 입력하고 있습니다. 바이트 배열을 write()메서드를 사용하여 OutputStream에 배열값을 기록합니다. 그런 후에 flush()메서드를 이용, OutputStream에 있는 “STOP”라는 글을 도스 콘솔창에 출력하고 close()메서드로 Stream을 닫습니다. 그리고나서 ‘System.exit(-1);’로 프로그램은 자동으로 종료가 됩니다. exit()메서드는 현재 실행하고 있는 자바가상머신(JVM)을 종료해줍니다. 좀더 지세히 알고 싶으시다면 API(java.lang.System패키지)를 참조하세요.

 

n        if(ch == 'S') {

n           byte[] arr= new byte[4];

n           arr[0] = 83;

n           arr[1] = 84;

n           arr[2] = 79;

n           arr[3] = 80;

n           out.write(arr);

n           out.flush();

n           out.close();

n           in.close();

n           System.exit(-1);

n        }

 

 

flush()

OutputStream의 멤버메서드로 호출되면 Buffer에 있는 내용을 강제로 비우게 해서 출력시킨다.

 

 위 의 out.write(cha); 라는 구문은 읽어 들인 바이트 배열을 스트림에 기록하는 역할을 합니다. 그런 후 out.flush(); 라는 구문을 사용하여 기록된 스트림을 도스창(명령 프롬프틈)에 출력하게 됩니다. 입력값들 중에 ‘S’가 없다면 모든 입력된 값을 char형으로 변환하여 출력을 하고, available()메서드를 사용하여 실행을 중단하지 않고 입력 스트림에서 읽을 수 있는 byte의 수를 그 옆에서 출력합니다.

 

! 그럼 출력된 결과를 살펴보겠습니다. 먼저 프로그램을 실행시키면 아무 글이나 입력하라고 했습니다. 저는 ‘java’를 입력하고 Enter를 쳤습니다. 그 결과, ‘Char: j, Available: 5’가 첫 줄에 출력되고 있습니다. 우리가 입력한 것은 ‘java’라는 글 네개와 Enter키 1개를 포함, 모두 5가지를 입력하였죠. 그래서 Available에 5라고 나오는 것입니다. Available값이 4가 아니라 왜 5냐고요? 그것은 잠시후에 알려드리죠. ‘, Available: 1’는 Enter키를 뜻하는 것이구요. 그 다음에 나온 ‘, Available: 0’은 읽어들이는 데이터가 없는 경우 버퍼가 모든 데이터를 다보냈다는 표시를 감지한 것입니다. 이 값은 표시가 안되죠. 그리고 버퍼에서 더 이상 읽어 들일 것이 없으니까 Available값은 0이 나온 것이구요. 그래서 아까 j의 Available값이 5인 것입니다. 두번째로 대문자 ’S’를 입력하면, 위에서 말씀드린 대로  프로그램이 실행되어 종료가 되는 것입니다.

 

간단한 예제 프로그램으로 InputStream과 OutputStream을 사용하여 키보드에서 값을 입력 받고, 그 값을 비교하는 법과 출력하는 법을 알아보았습니다. 재미있으셨나요?

I

이렇게 InputStream과 OutputStream은 java.io패키지에서 가장 중요하다고 말해도 틀렸다고 말하기 어려울 정도로 자주 사용되며 중요한 클래스입니다. 몇번 보고 완전히 이해하기는 어려운 클래스이니 그저 자주 보고 사용법을 익히는 것이 가장 좋을 듯 싶습니다.

 

InputStream 주요 멤버메서드

public int available() : 실행을 중단하지 않고 입력 스트림에서 읽을 수 있는 바이트의 수를 반환합니다.

public void close() : 입력 스트림을 닫고 스트림과 연관된 모든 시스템 자원을 해제합니다.

public void mark(int readlimit) : 입력 스트림의 현재 위치를 표시합니다.

public boolean markSupported() : 입력 스트림이 mark 및 reset 메서드를 지원하는지 여부를 테스트합니다.

public abstract  int read() : 입력 스트림에서 데이터의 다음 바이트를 읽습니다.

public int read(byte[] b) : 최대 b.length 바이트의 데이터를 입력 스트림에서 바이트의 배열로 읽어 들입니다.

public int read(byte[] b, int off, int len) : 최대 len 바이트의 데이터를 입력 스트림에서 바이트의 배열로 읽어 들입니다.

public void reset() : 입력 스트림에서 마지막으로 mark 메서드가 호출되었을 때의 위치로 스트림 위치를 재지정합니다.

public long skip(long n) : 입력 스트림에서 n 바이트의 데이터를 건너뛴 후 버립니다.

 

OutputStream 주요 멤버메서드

public void close() : 출력 스트림을 닫고 스트림과 연관된 시스템 자원을 해제합니다.

public void flush() : 출력 스트림을 내보내고 강제로 버퍼된 출력 바이트가 기록되게 합니다.

public void write(byte[] b) : 지정된 바이트 배열에서 b.length 바이트를 출력 스트림에 기록합니다.

public void write(byte[] b, int off, int len) : len개의 바이트를 오프셋 off에서 시작하여 지정된 바이트 배열에서 출력 스트림에 기록합니다.

public abstract  void write(int b) : 지정된 바이트를 출력 스트림에 기록합니다.

'ILoveCoffee, ILoveJava' 카테고리의 다른 글

사용자 정의 Exception Class  (0) 2008.02.01
Vector, Set, ArrayList, Map등등의 차이점  (0) 2008.01.31
java jar파일로 exe(실행파일) 만들기  (1) 2008.01.28
Warming up_01  (0) 2008.01.19
힙(heap) 메모리  (1) 2008.01.19