IO.Stream
IO.Stream
IO.stream/2와 IO.binstream/2가 반환하는 IO.Stream 구조체를 정의해요. 공개 필드는 다음과 같아요.
device— IO 장치raw— bin 함수를 사용할지 여부를 나타내는 booleanline_or_bytes— 읽기가 줄(line) 단위로 할지, 주어진 바이트 수대로 할지를 나타내는 값
출처: IO.Stream
본문
IO stream은 지연 평가(lazy)되는 스트림으로, 파일이나 장치에서 줄 단위 또는 바이트 단위로 데이터를 읽는 데 사용해요. IO.stream/2는 chardata(텍스트)를 줄 단위로 읽고, IO.binstream/2는 바이너리 데이터를 주어진 바이트 수만큼 읽어요. 둘 다 반환하는 IO.Stream 구조체에 위 필드들이 담겨요.
한 가지 꼭 기억해야 할 점이 있어요. IO stream은 **부작용(side effect)**이 있어요. 그래서 스트림을 매번 순회할 때마다 다른 결과를 얻을 수 있어요. 파일의 내용이 그 사이에 바뀌었거나 읽기 위치가 다르다면, 같은 스트림을 두 번 순회해도 각각 다른 줄/데이터가 나올 수 있어요.
예를 들어 IO.stream(:stdio, :line)으로 표준 입력을 줄 단위로 읽는 스트림을 만들면, 그 스트림을 순회할 때마다 그 시점의 입력을 읽어요. 파일 뒤에 줄이 추가된다면 두 번째 순회에서는 추가된 줄까지 볼 수 있는 식이에요. 순수 함수적인 컬렉션과 달리, IO stream은 "가리키는 대상"이 아니라 "살아 있는 읽기 경로"에 가깝게 동작한다고 이해하면 좋아요.
실제로는 IO.stream/2와 IO.binstream/2를 직접 쓰기보다, File.stream!/3 같은 편의 함수를 통해 파일 스트림을 얻고 이를 Enum과 결합해 사용하는 경우가 많아요.
더 알아보기
- IO.stream/2 — 줄 단위 텍스트 스트림 생성
- IO.binstream/2 — 바이트 단위 바이너리 스트림 생성
- IO — IO 장치와 입출력 함수
- Enum — 스트림을 순회·변환하는 함수