MAC 441/5714 - Programação Orientada a Objetos
Aula 9 - 08/04/2008
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 position: 4. "move
o ponteiro para a posição 4"
stream nextPut: 6.
stream contents.
"devolverá o Array #(1 2 3 4 6)"
vetor :=
OrderedCollection new.
vetor addAll: #(1 2 3 4
5).
stream := ReadWriteStream
with: vetor.
stream position:1.
stream next. "devolve o 2
e, como efeito colateral, avança o ponteiro do Stream".
stream nextPut: 6.
stream contents. "devolve
o OrderedCollection vetor contendo #(1 2 6 4 5)"
vetor := OrderedCollection new.
vetor addAll: #(1 2 3 4 5).
stream := WriteStream on:
vetor. "cria um stream e
posiciona o ponteiro p/ o
início"
stream nextPut: 6.
stream contents.
"devolverá o Array #(6)"
agora := Time now.
s := WriteStream on:
(String new:16).
agora printOn: s.
display := StringMorph
new.
display acceptValue:(s
contents).
display fontName:
'BitStreamVeraSans' size:61.
display openInWorld.
"Mostra, no canto da
tela, um texto contendo hora+min+seg"
- enviando mensagens para as coleções (definidas na
classe SequenceableCollection):
- readStream, writeStream.
- Exemplo do mais complexo:
vetor := Array new: 10.
stream := vetor
writeStream. "cria um stream e posiciona o ponteiro no início da
coleção"
stream nextPut: 6;
nextPut: 3.
vetor contents. "o
resultado será #(6 3 nil nil nil nil nil nil nil nil)"
- Métodos importantes:
- Leitura: next, next: ,
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
colocar
no Stream um String cuja avaliação reconstrói o
objeto.
p.ex. para um conjunto o storeOn
poderia guardar o seguinte String: (Set new add: $a; add $b; add $c)
)
- A classe Object
implementa o método printString
baseado no printOn.
Então, ao implementar printOn:,
o printString passa a
funcionar também.
- Vejamos por exemplo, a implementação de printOn: aStream da classe
Collection no VisualWorks:
- 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 é feita através de objetos do tipo
FileStream, que é uma subclasse de ReadWriteStream:
- Exemplos:
- meuArq := FileStream
fileNamed:
'arq.txt'.
meuArq nextPutAll: 'E
aí
moçada como vamos de Smalltalk?' ; cr; tab;
nextPutAll: '- Maneiro, oh brod!'.
lendo := FileStream
fileNamed: 'arq.txt'.
string := lendo contents.
Transcript show: string.
lendo close.
Referência
Nota: O Squeak não é totalmente compatível
com o Smalltalk-80 no quesito streams de manipulação de
arquivos. As referências abaixo citam algumas classes (como ExternalStream)
que não se fazem presentes nas imagens (até a
versão 3.7, pelo menos) do Squeak. A mesma funcionalidade
é coberta, no squeak, pela classe FileStream e por
outras na categoria System - Files.
- 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 441/5714
Página do Fabio
Página do DCC