MAC 441/5714 - Programação Orientada a Objetos
Aula 13 - 27/4/2004
Streams Smalltalk
- Um Stream é um mecanismo que permite a leitura e/ou
escrita de dados de forma seqüencial em uma Coleção,
String ou Arquivo.
- Podemos percorrer todos os elementos de uma OrderedCollection
usando first e after: (desde que a coleção não
tenha elementos repetidos); mas para isso precisamos manter uma
referência para o elemento corrente da coleção.
- Um Stream é uma forma de encapsular esta referência
de forma que possamos percorrer todos os elementos de uma
coleção (ou outros tipos como String e Arquivos) de uma
forma padronizada.
Streams associados a coleções
- O tipo PositionableStream
tem como subclasses ReadStream,
WriteStream, ReadWriteStream.
- Acessamos os vários elementos com o método next.
- Colocamos novos elementos com o método nextPut:.
- Colocamos uma coleção de elementos com nextPutAll:. A
coleção pode ser, por exemplo, um String.
- Há duas formas principais de se criar um Stream sobre uma
coleção
- enviando mensagens para as subclasses de Stream
- vetor :=
OrderedCollection new.
vetor addAll: #(1 2 3 4 5).
stream := WriteStream
with: vetor. "cria um stream e posiciona o ponteiro para o fim da
coleção"
stream nextPut: 6.
stream contents.
"devolverá o Array #(1 2 3 4 5 6)"
vetor := OrderedCollection new.
vetor addAll: #(1 2 3 4 5).
stream := WriteStream on:
vetor. "cria um stream e
'resseta' a coleção posicionando o ponteiro p/ o
início"
stream nextPut: 6.
stream contents.
"devolverá o Array #(6)"
agora := Timestamp now.
s := WriteStream on:
(String new:16).
agora printOn: s.
Dialog warn: (s contents).
"abrirá uma janela
com a data+hora+min+seg+ms"
- enviando mensagens para as coleções (definidas na
classe SequenceableCollection):
- readStream, writeStream, readWriteStream, NewReadWriteStream(esta
última zera a coleção).
- Exemplo do mais complexo (readWriteStream):
vetor :=
OrderedCollection new.
vetor addAll: #(1 2 3 4 5).
stream := vetor
readWriteStream.
stream next. "devolve o 1 e, como efeito colateral, avança o
ponteiro do Stream".
stream nextPut: 6.
stream contents. "devolve
o OrderedCollection vetor contendo #(1 6 3 4 5)"
- Métodos importantes:
- Leitura: next, next:,
nextAvailable:, upToEnd, through:, throughAll:, contents.
- Escrita: nextPut,
nextPutAll, print, cr, tab, tab:, crtab: space.
- Posicionamento: atEnd,
reset, setToEnd, readPosition, writePosition, skip, skipSeparators,
skipUpTo:.
- Impressão via printOn:
aStream
- Todo objeto deve (ou deveria) implementar a mensagem printOn: e storeOn:
- (a diferença é que storeOn: aStream tem que coloca
no Stream um String cuja avaliação reconstroi o objeto.
p.ex. para um conjunto o storeOn
poderia guardar o seguinte String: (Set new add: $a; add $b; add $c)
)
- Vejamos por exemplo, a implementação de printOn: aStream da classe
Collection:
- Collection>>printOn: aStream
aStream nextPutAll: self class name.
aStream space.
aStream nextPut: $(.
self do: [:element |
element
printOn: aStream.
aStream
space].
aStream nextPut: $)
Manipulação de Arquivos
- A manipulação de arquivos para entrada e
saída de dados é feito através de dois tipos de
objetos:
- Filename: que
representa o nome completo de um arquivo
- ExternalStream:
que são os objetos, em memória,
que representam os arquivos.
- Exemplos:
- meuArq := Filename named:
'arq.txt'.
ws := meuArq writeStream.
ws nextPutAll: 'E aí
moçada como vamos de Smalltalk?' ; cr; tab;
nextPutAll: '- Maneiro, oh brod!'.
ws close.
rs := 'arq.txt' asFilename
readStream.
string := rs contents.
Dialog warn: string.
Referência
- Abdala & Wangenheim. Conhecendo o Smalltalk. Capítulo
8: Manipulação
de Arquivos e Estruturas de Acesso Seqüencial. Visual Books,
2002.
- Goldberg & Robson. Smalltalk-80 - The Language and its
Implementation. Capítulo 12: Protocols
for Streams. Addison-Wesley, 1983.
Próxima Aula
Aula
Anterior
Página de MAC 413/5715
Página do Fabio
Página do DCC