JAVA

[Java] Stream의 종류

로춘남 2022. 6. 28. 22:16
728x90


Input이란 메모리로 들어오는 데이터의 흐름. Output은 메모리에서 빠져나가는 데이터를 의미.

메모리는 데이터를 byte 단위로 처리하는데, 이 byte의 흐름을 Stream이라고 한다.

Java의 Stream은 여러가지가 있는데, 한 번 파악해보자


InputStream

System.in의 경우 많이 봐온거 같다. 이것은 System 클래스의 InputStream 타입의 static final 상수이다. InputStream은 입력 받을 수 있는 객체로 1byte 단위를 처리하는 스트림이다. 그렇기 때문에 영문자, 숫자, 특수문자 등이 처리가 가능하지만, 기본적으로 2byte부터 시작하는 한글의 경우에는 처리가 불가능하다.

 

ex 1)

1. InputStream 타입의 roma에 System.in의 참조값 담기

InputStream roma = System.in;

 

2. roma의 read() 메소드를 이용하여 입력한 코드값 읽어와서 출력하기

try {
	//입력한 키의 코드값 읽어오기
	int code = roma.read();
	System.out.println(code);
	char ch = (char)code;
    System.out.println(ch);
}catch (IOException e) {
	e.printStackTrace();
}

코드값이 255 이상이면, ch의 값이 출력되지 않는다.

즉, 한글인 '가'를 입력하면 '가' 가 제대로 출력되지 않고 한글이 깨져버려 알수없는 문자가 출력 된다.

 

package test.main;

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

public class MainClass01 {
	public static void main(String[] args) {

		InputStream roma = System.in;
		System.out.print("입력: ");
		try {
			//입력한 키의 코드값 읽어오기
			int code = roma.read();
			System.out.println(code);
			char ch = (char)code;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("main 메소드가 종료 됩니다.");
	}

}

OutputStream

System 클래스에는 out이라는 static 필드에 콘솔창에 출력 할 수 있는 PrintStream 객체의 참조값이 들어있다.

 

1. System.in의 PrintStream 참조값을 지역변수 ps에 넣기 

PrintStream ps = System.out;

 

2. 학습을 위해서 PrintStream 객체를 부모 type OutputStream으로 받아보기 

OutputStream os = ps;

 

3. 코드 출력해보기. flush()까지 호출해야 출력이 된다.

try {
	//출력은 .flush() 까지 호출해야 출력이 된다. 
	os.write(97);
	os.write(98);
	os.write(99);
	//한글 '가' 의 unicode 값이 44032 인데 한글이 출력이 될까???
	//os.write(44032); OutputStream 은 한글 출력 불가
	os.flush();//방출하기 
} catch (IOException e) {
	e.printStackTrace();
}

 

package test.main;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

public class MainClass04 {
	public static void main(String[] args) {
		
		PrintStream ps = System.out;
		OutputStream os = ps;
		try {
			//출력은 .flush() 까지 호출해야 출력이 된다. 
			os.write(97);
			os.write(98);
			os.write(99);
			//한글 '가' 의 unicode 값이 44032 인데 한글이 출력이 될까???
	        //os.write(44032); OutputStream 은 한글 출력 불가
			os.flush();//방출하기 
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

InputStreamReader

 

InputStreamReader은 2byte처리 스트림이다. InputStream 타입을 생성자의 인자로 전달받는다.

 

1. InputStreamReader 객체 생성하여 지역변수 isr에 참조값 넣기

InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);

 

2. 한글의 코드값을 읽을 수 있는지 확인하기

try {
	System.out.print("입력:");
	//한글의 코드값도 읽어들일 수 있다.
	int code = isr.read();
	System.out.println("code: "+code);
	//코드값에 대응되는 문자 얻어내기 
	char ch = (char)code;
	System.out.println(ch);
}catch (IOException e) {
	e.printStackTrace();
}

 

package test.main;

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

public class MainClass02 {
	public static void main(String[] args) {
		//1byte 처리 스트림
		InputStream is = System.in;
		//2byte 처리 스트림 
		InputStreamReader isr = new InputStreamReader(is);
		try {
			System.out.print("입력:");
			//한글의 코드값도 읽어들일 수 있다.
			int code = isr.read();
			System.out.println("code: "+code);
			//코드값에 대응되는 문자 얻어내기 
			char ch = (char)code;
			System.out.println(ch);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

OutputStreamWriter

 

OutputStreamWriter는 OutputStream 타입을 생성자의 인자로 전달받는다.

 

1. OutputStreamWriter 객체 생성해서 지역변수 osw에 참조값 담기

OutputStream os=ps;
OutputStreamWriter osw = new OutputStreamWriter(os);

 

2. 문자열과 코드 출력 테스트해보기

try {
	osw.write(44032);
	osw.write("오잉?");
	osw.flush();
} catch (IOException e1) {
	e1.printStackTrace();
}

 

package test.main;

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;

public class MainClass05 {
   public static void main(String[] args) {
     
      PrintStream ps=System.out;
     
      OutputStream os=ps;
      OutputStreamWriter osw = new OutputStreamWriter(os);
      try {
		osw.write(44032);
		osw.write("오잉?");
		osw.flush();
	} catch (IOException e1) {
	
		e1.printStackTrace();
	}
   }
}

BufferedReader

BufferedReader는 Scanner에 비해 상대적으로 빠르지만, 엔터만 경계로 인식한다.

BufferedReader도 2 byte 처리 스트림이다. 

 

BufferedReader은 Reader 타입을 전달받는데, InputStreamReader은 Reader의 자식이므로, 자바의 다형성에 의해 InputStreamReader 타입도 넘겨줄 수 있다.

 

따라서, 다음과 같이 코드를 작성할 수 있다.

 

1.  BufferedReader 객체를 생성해서 지역 변수 br에 참조값 저장하기

InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

 

2. 문자열 입력 받고 출력하기

try {
	System.out.println("문자열 한줄 입력:");
	//문자열 한줄 입력 받기
	String line = br.readLine();
	System.out.println("입력한 문자열: "+ line);
} catch (IOException e) {
	
	e.printStackTrace();
}

 

package test.main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Scanner;

public class MainClass03 {
	public static void main(String[] args) {
		//1 byte 처리 스트림
		InputStream is = System.in;
		//2 btye 처리 스트림
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		
		try {
			System.out.println("문자열 한줄 입력:");
			//문자열 한줄 입력 받기
			String line = br.readLine();
			System.out.println("입력한 문자열: "+ line);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		Scanner scan = new Scanner(System.in);
		String line = scan.nextLine();
		
	}
}

BufferedWriter

 

1. BufferedWriter 객체 생성하여 BufferedWriter 타입의 지역변수 bw에 참조값 담기

 

BufferedWriter 생성자는 Writer타입을 전달받는다.

따라서, PrintStream 타입의 참조값을 OutputStream 타입에 전달하고, OutputStreamWriter 객체 생성 시 생성자의 인자로 전달하여 OutputStreamWriter 지역변수에 넣어준 후, OutputStreamWriter의 부모가 Writer이므로 이 참조값을 BufferedWriter 생성자의 인자로 전달할 수 있다. (이렇게 안해도되는데 앞에서 배운것을 응용하여 복잡하게 해보았다.)

코드로 확인하면 간단하다.

PrintStream ps=System.out;
//학습을 위해서 PrintStream  객체를 부모 type OutputStream 으로 받아보기
//OutputStream 도 1byte 처리 스트림이다.
OutputStream os=ps;
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);

 

2. 문자열 출력해보기 (write( ), newLine( ))

write( )와 newLine( ) 메소드로 출력할 수 있는데 newLine( )은 개행기호를 출력해주는 메소드가 내장되어있다.

 

try {
    bw.write("하나\n");
    bw.write("두울");
    bw.newLine();//개행기호를 출력해주는 메소드가 있다. 
    bw.write("세엣");
    bw.flush();
		
} catch (IOException e1) {
	e1.printStackTrace();
}
package test.main;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;

public class MainClass06 {
   public static void main(String[] args) {
      
      PrintStream ps=System.out;
    
      OutputStream os=ps;
      OutputStreamWriter osw = new OutputStreamWriter(os);
      BufferedWriter bw = new BufferedWriter(osw);
      
      try {
    	  bw.write("하나\n");
    	  bw.write("두울");
    	  bw.newLine();//개행기호를 출력해주는 메소드가 있다. 
    	  bw.write("세엣");
    	  bw.flush();
		
	} catch (IOException e1) {
		
		e1.printStackTrace();
	}
   }
}

 

출처 남겨야하는데...어디서 참고했는지..메모한 부분이 사라졌다..으잉..ㅠㅜ

728x90