SqueakByExample:10.2
스트림 VS 컬렉션(Streams vs. collections)
컬렉션 프로토콜은 컬렉션의 구성요소들이 가진 저장소(the storage), 제거(removeal) 그리고 열거(enumeration)를 지원하지만, 이러한 연산들의 혼합을 허용하지는 않습니다. 예를 들면, 만약 OrderedCollection의 구성요소가 do: 메소드에 의해 처리되면, do: 블록 내부에 구성요소들을 추가하거나 제거하는 작업이 불가능해집니다. 컬렉션 프로토콜(the collection protocol)은, 어떤 컬렉션(collection)이 계속 앞으로 진행되고 어떤 컬렉션이 그렇지 않은지를 선택함으로써 동시에 2 개의 컬렉션을 반복적용(iterate)하기 위한 방법들을 제공하지 않습니다. 이러한 절차들(procedures)은 횡단 인덱스(traversal index) 또는 컬렉션 자체 외부에 유지되는 위치참조(position reference)를 요구합니다: 이것은 ReadStream, WriteStream 과 ReadWriteStream의 정확한 역할입니다.
이 3개의 클래스는 동일한 컬렉션에서 스트림을 실행하기 위해 정의됩니다. 예를 들면, 다음 코드 조각은 인터벌(an interval)에 스트림(stream)을 만들고 2 개의 구성요소를 읽습니다.
r := ReadStream on: (1 to: 1000).
r next. ⇒ 1
r next. ⇒ 2
r atEnd. ⇒ false
WriteStream은 컬렉션(collection)에 데이터를 쓰기(writing) 할 수 있습니다.
w := WriteStream on: (String new: 5).
w nextPut: $a.
w nextPut: $b.
w contents. ⇒ 'ab'
읽기 프로토콜(the reading protocol)과 쓰기 프로토콜(writing protocols) 모두를 지원하는 ReadWriteStreams를 만드는 것 또한 가능합니다.
WriteStream 와 ReadWriteStream의 주요 문제는, 스퀵에서 배열(arrays)과 문자열(Strings)만을 지원한다는 것입니다. 이 문제는 Nile로 작명된 새로운 라이브러리의 개발에 의해 변경되고 있는 중이지만, 현재 여러분이 다른 종류의 컬렉션에 스트림 실행을 시도하면, 에러를 보게 되실 것입니다:
w := WriteStream on: (OrderedCollection new: 20).
w nextPut: 12. ⇒ raises an error
스트림은 컬렉션 뿐만 아니라 파일 그리고 소켓(sockets)에도 사용될 수 있습니다. 다음 예시는 test.txt라 작명된 캐리지 리턴(carriage return)에 의해 분리된 파일을 만들고 그 파일에 문자열을 작성(쓰기)한 다음 그 파일을 닫습니다.
StandardFileStream
fileNamed: 'test.txt'
do: [:str | str
nextPutAll: '123';
cr;
nextPutAll: 'abcd'].
다음 섹션들은 좀더 깊이 있게 프로토콜들을 제시합니다.