본문 바로가기

강좌/JAVA I/O

JAVA I/O (자바입출력) - InputStream과 OutputStream

자바 I/O중 바이트 스트림에 관련된 가장 최상이 클래스인 InputStream과 OutputStream

 

간단한 예제를 보자.

(참고로 영문은 1바이트, 한글은 2바이트이다.)

 

import java.io.IOException;

 

public class ByteStreamTest {
    public static void main(String[] args) throws IOException{
    byte data[] = new byte[20]; // 외부에서 읽어드린 데이터를 저장 하는 변수 선언.(바이트니까 바이트 객체로..20바이트만 읽음. 배열 갯수는 알아서)
  
    System.out.println("Input data : ");
    System.in.read(data);  //System.in.read(data)를 쓰면 콘솔화면에서 입력한 데이터를 읽어 드린다.
  
    System.out.println("읽은 데이터");
  

    //선언된 배열 갯수 만큼 루프문을 돌려서 차례대로 찍는다.

    // 다만 20바이트가 넘어가면 그 이후로는 짤린다.
    for(int i=0;i<data.length;i++){
        System.out.print((char)data[i]);
    }
 }
}

 

아래 결과값을 보면 20글자(영문) 넘어가면 그 이후 글자는 짤린다. 

 

 

위의 예제는 1바이트씩 읽어서 찍는건데 한글(2바이트)를 입력하면 어떻게 될까?

한글을 입력하면 그대로 찍히지 않고 깨진다. 왜냐하면 위의 예제는 1바이트씩 처리하는데

2바이트가 넘어가면 중간에 인코딩을 해주어야 하는데 그런게 없다.

 

 

깨져보인다.

 

 

자 그럼 두번째로 위의 예제와 조금 다르게 InputStream과 OutputStream을 사용해서 해보자.

 

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

 

public class ByteStreamEx02 {
 

    public static void main(String[] args){
        streamTest(System.in, System.out); //메인 화면에서 처리보다 별도의 메소드를 만들어서 System.in과 System.out을 변수를 던진다.
   }
 

   //그럼 여기서 어떻게 받을까? InputStream과 OutputStream은 자바 I/O클래스에서 가장 상위에 있기때문에 받을 수 있다. 따라서 InputStream is, OutputStream os로 메인에서 던진 System.in, System.out을 받자.
   public static void streamTest(InputStream is, OutputStream os){
 
       try {
           while(true){   //무한루프를 돌린다. 계속 읽으면서 찍는것이다. 첫번째 예제는 byte배열로 20자만 찍었지만 여기서는 입력한 대로 다 찍는다. 다만 input값이 -1이 들어 올때 종료 시킨다.
               int readInt = is.read();  //InputStream read메소드다. 아스키 숫자형태로 읽어서 로컬변소 readInt에 담는다.
          

               // -1 (ctrl + z가 -1)
              if(readInt == -1){
                  break;
              }
              os.write((char)readInt);   //System.out.print을 써도 되지만 우린 OutputStream을 써먹는게 중요하기때문에 파라미터러 받은 OutputStream을 사용하자 OutputStream에는 wrtie메소드가 있다 이걸 이용해서 출력한다.
          }
      } catch (IOException e) {
          // TODO Auto-generated catch block
         e.printStackTrace();
  }
 }
}

 

 

 

위의 결과를 보면 입력한 값을 무한 루프로 돌면서 다 찍는다.

 

예제를 작성 할때는 InputStream, OutputStream을 import하고 적절한 예외처리를 선언해줘야 한다.