Stream
Stream (literalmente "fluxo" ou "corrente") é uma classe que implementa o protocolo para realizar o acesso sequencial aos elementos de coleções indexadas, tais como Arrays, Strings e OrderedCollections.
Cada instância de Stream contém 3 componentes principais:
Na ilustração abaixo, é mostrada uma Stream s, que acessa um Array a de 6 elementos. O marcador de posição indica que a última posição acessada foi a de número 4:
Streams são úteis para implementar algorítmos que percorrem coleções sequenciais. A classe Stream é, na realidade, uma classe abstrata, pois são as suas sub-classes, abaixo descritas, que possuem instâncias diretamente:.
ReadStream - objetos desta classe são usados para acessar
coleções de objetos exclusivamente para fins de leitura.
WriteStream - objetos desta classe são usados para acessar
coleções de objetos exclusivamente para fins de
gravação ou saída. O protocolo de WriteStream permite
que as coleções acessadas sejam automaticamente expandidas
para acomodar mais elementos. Para isso, cada instância mantém,
além dos tres componentes básicos, um marcador da
posição de maior ordem já gravada na coleção
que ela acessa. O protocolo de WriteStream não aceita acesso para
leitura.
ReadWriteStream - sub-classe de WriteStream, incorpora ambos os protocolos
de ReadStream e de WriteStream.
FileStream - sub-classe de ReadWriteStream. Objetos desta classe são
usados para acessar arquivos externos vistos como uma longa sequência
de bytes ou caracteres. O protocolo é modificado em relação
aos anteriores, pois não se trata mais de acessar objetos genéricos.
O primeiro componente, isto é, a coleção acessada, é
nesse caso uma referência ao "buffer" de página do arquivo,
que contém uma String. Outros componentes são acrescentados
para armazenar dados específicos.
TerminalStream - sub-classe de ReadWriteStream, usada em Smalltalk/V, para definir o protocolo de leitura e escrita em um terminal.
Streams são usadas em todos os métodos que implelmentam acessos de leitura e/ou gravação em qualquer coleção indexável de objetos. Uma mesma coleção pode ter várias Streams a ela associadas. Streams podem ser criadas através da mensagem abaixo enviada à sub-classe desejada:
on: umaColeçãoIndexada
Por exemplo, uma ReadStream s como a da figura acima poderia ser criada executando a expressão abaixo:
s := ReadStream on: #(5 4 20 1 7 12)
O marcador de posição, neste caso, é inicializado com valor zero.