[Java] InputStream 과 OutputStream 간의 스트림 통신

2021-03-06


-정의

 

InputStream과 OutPutStream모두 스트림 클래스의 최상위 클래스로 모두 추상 클래스이다. 때문에 자신의 new 연산자로 는 객체를 생성할 수 없으며, 자식 클래스 및 System 객체 자체를 매개 값으로 받아야 한다.

(전체 코드는 게시물 맨 아래에 올려두었다.)


- 선언

 

		InputStream is = System.in;
		OutputStream os = System.out;
	
		byte [] checkByte = new byte [100];
		int size = -1;
		// 입력된 데이터가 더이상 있는지 여부를 체크할
		// size 변수 -1일 경우 더 이상의 데이터가 없다.

 

선언부에서는 입력/출력 스트림을 모두 System.in /. out를 매개 값으로 받아 객체를 선언해주었다. 변수로는 입력 스트림의 매개 값으로 들어갈 바이트 배열과 읽어 들인 데이터의 사이즈를 확인할 size 변수도 하나 선언해 주었다.

 


- 실행

 

		System.out.println("데이터를 입력해주세요 ->  ");
		try {
			while((size = is.read(checkByte)) != -1) {
				System.out.println("\n== 입력된 데이터는 아래와 같습니다.==");
				os.write(checkByte, 0, size);
				// String 객체를 만들 필요 없이 바로 출력해주면 된다.
				// 단 현재 입력된 문자열의 길이만큼만 출력해야
				// 원하는 결과를 얻을 수 있다.
				os.flush();
				// 담아 있는 버퍼를 비워준다.
				// 비워주지 않을시 배열에 남아있는 공백문자가 남아있게된다.
				
				System.out.println("\n[ctrl + z] 누르면 InputStream는 종료됩니다. ");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				is.close();
				os.close();
				// 자원이 사용이 끝나면 닫아줌으로써
				// 풀어준다.
				
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

 

while문으로 계속 루프를 돌면서 데이터를 입력받고, 입력받은 데이터를 곧바로 출력스트림으로 전체 데이터를 출력하는 방식이다. 여기서 중요한 점은 출력 후 버퍼에 담아 있을 수 있는 잔여 데이터를 반드시 flush메서드를 통해 내보내 주어야 한다.(버퍼를 비워두지 않으면, 이후 입력받은 문자열과 버퍼에 남아있는 데이터가 같이 출력될 수 도 있다.) 이후 콘솔 창에 종료를 원할 경우 ctrl+z 를 누르면 while 루프 문의 종료와 함께 입력 스트림과 출력 스트림의 close 되면 프로그램이 종료되게 된다.


- 전체 코드

 

package Input_Output_Call;

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

public class Main {

	public static void main(String[] args) {
		
		InputStream is = System.in;
		OutputStream os = System.out;
	
		byte [] checkByte = new byte [100];
		int size = -1;
		// 입력된 데이터가 더이상 있는지 여부를 체크할
		// size 변수 -1일 경우 더 이상의 데이터가 없다. 
		
		System.out.println("데이터를 입력해주세요 ->  ");
		try {
			while((size = is.read(checkByte)) != -1) {
				System.out.println("\n== 입력된 데이터는 아래와 같습니다.==");
				os.write(checkByte, 0, size);
				// String 객체를 만들 필요 없이 바로 출력해주면 된다.
				// 단 현재 입력된 문자열의 길이만큼만 출력해야
				// 원하는 결과를 얻을 수 있다.
				os.flush();
				// 담아 있는 버퍼를 비워준다.
				// 비워주지 않을시 배열에 남아있는 공백문자가 남아있게된다.
				
				System.out.println("\n[ctrl + z] 누르면 InputStream는 종료됩니다. ");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				is.close();
				os.close();
				// 자원이 사용이 끝나면 닫아줌으로써
				// 풀어준다.
				
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	
	}

}