JAVA

[JAVA] I/O스트림

EJUN 2023. 5. 23. 18:55

I/O란?
Input/Output으로 데이터를 입출력하는 것을 의미

데이터를 전달하는 방법은 다양한데 그 중에서 스트림(Stream), 버퍼(Buffer), 채널(Channel)을 기반으로 하는 I/O가 있다.

 

Stream(스트림)

스트림은 데이터를 전달하는 통로를 의미하는데 단방향으로 밖에 데이터를 전달할 수 없다.

즉, 데이터가 들어온 순서대로 데이터를 출력하는 단방향 통로이다.

또한 데이터를 읽고 쓰기 위해 스트림을 요청하면 스트림은 해당 데이터의 작업을 수행하는 동안 다른 데이터는 스트림에 접근하지 못하고 기다리는 동기화, Blocking방식으로 동작한다.

stream방식

위처럼 i값을 순서대로 하나씩 출력하는 방식을 stream방식으로 동작한다라고 한다.

 

Buffer(버퍼)

Buffer는 데이터를 임시로 한 곳에 모아두는 하나의 큐 형식이다.

Stream은 데이터가 들어오자마자 바로 출력을 하고 계속해서 데이터접근이 변경되기 때문에 오버헤드가 발생할 확률이 높다.

하지만 Buffer는 입력되는 데이터값을 큐 같이 임시적인 장소에 모아둔 후 다 차거나 더 이상 데이터입력이 없는 경우에 출력을 하기 때문에 오버헤드 발생확률이 낮다.

즉, 성능적인 측면에서는 Stream보다는 Buffer가 좋다.

Buffer방식

물론 위의 코드처럼 데이터 크기가 작은 경우에는 크게 차이가 없지만 데이터양이 많아질수록 Buffer방식으로 동작하는 I/O가 보다 효율적이다.

 

Channel(채널)

Channel은 NIO방식의 기본 입출력방식이다. (자바 4부터 NIO방식 등장)

Channel은 Stream과 달리 양방향의 통로이다.

여기서 IO, NIO의 차이가 무엇인지 궁금할 수 있다.

<IO vs NIO>
IO는 Stream을 통해서 데이터를 입출력하는 방식이고
NIO는 무조건 Buffer를 이용하여서 데이터를 입출력하는 방식이다.

Channel도 NIO방식이기 때문에 Buffer를 통해서만 데이터 입출력이 가능하다.

뿐만 아니라 Blocking방식과 Non-Blocking 방식 둘다 이용이 가능하다는 장점이 있다.

 

그렇다면 모든 데이터 입출력과정을 할 때 Blocking방식보다는 Non-Blocking방식이 좋을까?

물론 Non-Blocking이 성능측면에서는 좋을 수 있지만 데이터가 순차적으로 입출력이 되어야하는 상황에서는

Blocking방식이 더 효율적이므로 항상 좋다고 할 순 없다.


InputStream & OutputStream
InputStream은 파일의 데이터를 read해오는 역할
OutputStream은 파일에 데이터를 write하는 역할

InputStream & OutputStream방식

 

InputStream방식
OutputStream방식


Byte & Character 스트림
Byte스트림

바이너리 데이터를 입출력해주는 스트림이다.

위의 InputStream, OutputStream이 바이트 스트림의 최상위 추상클래스이다.

즉, 바이너리 데이터의 입출력을 담당한다.

 

 

Character스트림

처리할 데이터가 문자인 경우에 사용하는 스트림이다.


표준 스트림(in, out, err)

표준스트림은 우리가 자바를 사용하면서 많이 사용한다.

대표적으로 System클래스가 있다.

System클래스를 보면 in, out, err이 있다.

 

in은 표준 입력 스트림, out은 표준 출력 스트림, err은 표준 에러 스트림이다.

표준 스트림

 

각 스트림 변수

위의 코드를 보면 in은 InputStream클래스의 정적변수이고 out,err은 PrintStream클래스의 정적변수로 선언됨을

확인할 수 있다.

 

'JAVA' 카테고리의 다른 글

[JAVA] 동시성 & Thread  (0) 2024.03.03
JAVA_단위 테스트&통합 테스트  (1) 2023.10.16
[JAVA] 제네릭 < >  (0) 2023.05.23
[JAVA] Enum(열거 타입)  (0) 2023.05.17
[JAVA] Thread & Runnable & Multi Thread란?  (0) 2023.05.03