☕ Java I/O Stream

2024. 7. 17. 16:22개발/☕ JAVA

 

 

Java 입출력 스트림

 

입출력은 잘 알다시피 키보드로부터 데이터를 '입력'받고 화면을 통해 '출력'하는 과정을 의미한다.

Java에서는 입출력스트림이라는 방식을 통해서 수행한다.

 

스트림 : 데이터를 운반하는 데 사용되는 연결 통로

- 단방향 통신만 가능 ( Source -> Input Stream -> OutputStream -> Sink )

- FIFO(First In First Out) 구조

- 입력과 출력을 동시에 수행하려면 입력을 위한 입력 스트림, 출력을 위한 출력 스트림 총 2개가 필요

 

 

나는 여태까지 입력받을 때는 Scanner, 출력할 때는 System.out.println() 이런 애들만 사용해왔는데

데브코스에서 다른 분들의 코드를 보니까 대부분 입출력을 BufferedReader와 BufferedWriter를 통해 수행하는 것 같았기 때문에

BufferedReader와 BufferedWriter에 대해서 좀 공부해봤다

 

우선 BufferedReader와 BufferedWriter 코드를 살펴보면

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

엄청 길다...

 

BufferedReader와 BufferedWriter 코드를 자세히 살펴보면 Java의 입출력 스트림의 역사(?)를 알 수 있는데

InputStream in = System.in;
InputStreamReader ir = new InputStreamReader(in);
BufferedReader br = new BufferedReader(new InputStreamReader(in));

OutputStream out = System.out;
OutputStreamWriter ow = new OutputStreamWriter(out);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));

이러하다... 

간단하게 정리하자면

InputStream / OutputStream : 하나의 값만 입출력 가능

InputStreamReader / OutputStreamWriter : 여러개의 값 입출력 가능하지만 2개 이상부터는 고정된 배열에 저장하는 방식

BufferedReader / BufferedWriter : 여러개의 값 입출력이 가능하며 Buffer라는 가변적인 배열에 저장하는 방식

이런 흐름으로 스트림이 발전해왔다는 것이다!

 

마지막으로 BufferedReader/BufferedWriter의 특징과 사용 예시를 정리해보겠다!

 

BufferedReader / BufferedWriter 

- InputStreamReader / OutputStreamWriter가 고정적인 배열을 사용한다는 단점 보완

- Buffer라는 가변적인 배열 활용

- Buffer가 가득 차거나 개행문자가 들어오면 Buffer에 저장되어 있던 내용을 한번에 전송

- 장점 : 빠르다 / 가변적인 배열을 사용하기 때문에 공간 낭비 없음

- 단점 : 개행문자(엔터)에만 Buffer의 내용이 전송되기 때문에 띄어쓰기 단위로 데이터를 받고 싶다면 가공이 필수적

 

BufferedReader 사용 예시

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

//입력받기
String s = bf.readline(); //default : String
int i = Integer.parseInt(bf.readLine()); //int 변환

//띄어쓰기 단위로 데이터 가공
//*StringTokenizer 사용
StringTokenizer st = new StringTokenizer(s); //StringTokenizer에 입력 문자열 삽입
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());

//*String.split() 사용
String array[] = s.split(" ");

 

BufferedWriter 사용 예시

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

bw.write(s);//출력
bw.newLine();//줄바꿈
bw.flush();//버퍼에 남아있는 데이터 모두 출력
bw.close();//스트림 닫음