티스토리 뷰

Goal 

 - 입출력 스트림에 대해 알아본다

 - 표준 입출력 스트림에 대해 알아본다

 

1. 입출력 스트림이란?

 - 네트워크에서 자료의 흐름이 물과 같다는 의미에서 유래

 - 다양한 입출력 장치에 독립적으로 일관성 있는 입출력 방식 제공

 - 입출력이 구현 되는 곳에서는 모두 I/O 스트림을 사용 : 키보드, 파일 디스크, 메모리 등

 

2. 입출력 스트림 구분

 - I/O 대상 기준 : 입력 스트림, 출력 스트림

 - 자료의 종류 : 바이트 스트림, 문자 스트림

 - 스트림의 기능 : 기반 스트림, 보조 스트림 

 

2-1. 입력 스트림과 출력 스트림.

 - 입력 스트림 : 대상으로 부터 자료를 읽어 들이는 스트림

 - 출력 스트림 : 대상으로 자료를 출력하는 스트림  

 

2-2. 바이트 단위 스트림과 문자 단위 스트림

 - 바이트 단위 스트림 : 바이트 단위로 자료를 읽고 씀 (동영상, 음악파일 등)

 - 문자 단위 스트림 : 문자는 2바이트씩 처리 해야 함

2-3. 기반스트림 보조스트림

 - 기반 스트림 : 대상에 직접 자료를 읽고 쓰는 기능의 스트림(ex Read, Write)

 - 보조 스트림 : 직접 읽고 쓰는 기능은 없고 추가적인 기능을 제공해 주는 스트림, 기반 스트림이나 또 다른 보조 스트림을 생성자의 매개변수로 포함함.

 

데코레이터 패턴

 

 

3. 표준 입출력

 - System 클래스의 표준 입출력 멤버

public class System {
    public static PrintStream out; // 표준 출력 스트림
    public static InputStream in; // 표준 입력 스트림
    public static PrintStream err; // 표준 에러 스트림 
}

 

3-1. System.in

 - 한 바이트씩 읽어 들임 (InputStream의, System.in.read()를 통해 읽어들인다.)

 - 표준 IO는 계속 열려있기 때문에 close를 하지 않는다.

 - 한글과 같은 여러 바이트로 된 문자를 읽기 위해서는 InputStreamReader와 같은 보조 스트림을 사용해야 함.

 

1) System.in 사용

package stream.inputstream;

import java.io.IOException;

public class SystemInTest2 {

    public static void main(String[] args) {
        
        System.out.println("입력:");
        
        //enter를 입력하기 전까지 1바이트의 문자 출력 
        try {
         int i;
         while((i = System.in.read()) != '\n') {
             System.out.print((char)i);    
         }
              
        } catch (IOException e) {
         e.printStackTrace();
        }

    }

}

 

3-2 보조스트림을 사용하여 한글 입력.

 1) 한글을 읽어 들일 수 없는 System.in

 - 1바이트씩 읽어들일 수 있는 inputStream의 특성으로 '끝'이라는 2바이트 문자를 읽어들이지 못해 while문이 계속 실행됨.

package stream.inputstream;

import java.io.IOException;
import java.io.InputStreamReader;

public class SystemInTest3 {

    public static void main(String[] args) {
        System.out.println("입력 후 '끝' 이라고 쓰세요:");
        
        //System.in은 inpurStream이기 때문에 1바이트씩 읽어들여
        //2바이트인 한글은 인식할 수 없음. 따라서 while문이 끝나지 않음.
        try {
         int i;
         while((i = System.in.read()) != '끝') {
             System.out.print((char)i);    
         }
              
        } catch (IOException e) {
         e.printStackTrace();
        }

    }

}

 2) 출력결과

 - '끝'을 읽어들이지 못해 입력을 계속 받게 됨.

 - 네모창이 빨간색인것으로 프로그램이 계속 실행중인것을 확인할 수 있음.

 

 3) 보조스트림을 이용하여 한글 입력

 - InputStreamReader를 이용하여 2바이트의 한글을 읽음.

package stream.inputstream;

import java.io.IOException;
import java.io.InputStreamReader;

public class SystemInTest3 {

    public static void main(String[] args) {
        System.out.println("입력 후 '끝' 이라고 쓰세요:");
  
        //보조 스트림을 사용하여 한글을 읽어들임.
        try {
            int i;
            //InputStreamReader는 다른 Stream을 생성자의 매개변수로 받는다.
            InputStreamReader isr = new InputStreamReader(System.in);
            while((i = isr.read()) != '끝') {
                System.out.print((char)i);    
            }
                 
           } catch (IOException e) {
            e.printStackTrace();
           }
        //바이트단위로 자료를 읽을때, 그것을 다시 문자로 변환해줌 (InputStreamReader)

    }

}

 4) 출력 결과

 - 보조스트림을 통해 '끝'을 인식하여, '끝'이전까지 입력받은 내용을 출력함.

 

 

 

4. Scanner 클래스

 - java.util 패키지에 있는 입력 클래스

 - 문자뿐 아니라 정수, 실수 등 다양한 자료형을 읽을 수 있음

 - 생성자가 다양하여 여러 소스로 부터 자료를 읽을 수 있음 

 

5. Console 클래스 

 - System.in 을 사용하지 않고 콘솔에서 표준 입출력이 가능

 - 이클립스와는 연동되지 않음

 - Console 클래스의 메서드

1) Console 클래스 작성

 - 작성은 이클립스에서 가능하지만 출력은 콘솔에서가능

package stream.inputstream;

import java.io.Console;

public class ConsoleTest {

    public static void main(String[] args) {
        
        Console console = System.console();
        
        System.out.println("이름 : ");
        String name = console.readLine();
        System.out.println("비밀번호:");
        char[] password = console.readPassword();
        
        System.out.println(name);
        System.out.println(password);

    }

}

 2) cmd에서 실행결과 

'Java > Java 올인원 패키지' 카테고리의 다른 글

35. 쓰레드 Thread (Java)  (0) 2020.04.06
34. 직렬화 (Java)  (0) 2020.04.06
30. 예외 처리 (Java)  (0) 2020.03.24
29. 스트림 (Java)  (0) 2020.03.23
28. 람다식 (Java)  (0) 2020.03.23
댓글