Hola. En este curso, Hablaré sobre los streams.
Es una característica básica de Pharo.
Veremos qué son los streams, cómo usarlos y cuando pueden ser útiles.
¿Qué es un stream?
Es un objeto
que permite iterar sobre una colección de elementos,
una secuencia de elementos
Esta secuencia podría ser una colección en memoria,
un flujo de red, un archivo, etc.
Un stream mantiene la posición actual en memoria.
Mientras usa el stream, puede avanzar o retroceder,
leer o escribir elementos en el stream
Una descripción general de la API de los streams.
Para crear un stream, hay algunos objetos
sobre los cuales puede usar los mensajes readStream y writeStream
para crear streams
(de un archivo o una colección, por ejemplo).
Puede crear secuencias de esta manera.
Este mensaje, streamContents:, se envía a una colección
y toma un bloque como parámetro, que recibe un stream.
El uso de un stream dentro de este bloque crea una colección
que sera devuelta por el método.
Veremos cómo usar este método. en el final.
En este caso, pregunte directamente a una clase,
ya sea readStream, writeStream, o (Read/Write)Stream,
de crear una nueva instancia sobre una colección
Estos tres métodos pueden leer uno o varios elementos
hasta cierto punto.
Estos dos elementos
escriben un elemento o una colección de elementos en la secuencia (stream).
Estos son algunos ejemplos a través de los cuales Puedes leer un stream.
Primero, creamos un stream.
Estoy creando un stream en lectura a partir de una colección
La colección contiene todas las letras entre a y f.
Hay un carácter por cada elemento de la colección.
Creamos un stream sobre la colección. Echaremos un vistazo a los caracteres uno a uno.
Una vez que el flujo (stream) esté listo,
puede comenzar enviando el mensaje next
que devolverá el elemento situado justo después de la posición actual
cuando se inicializa el stream.
La posición actual es 0, Al comienzo del stream.
Next devuelve el primer elemento, el cual es el carácter a.
Si llamo next en este momento,
Conseguiré un b luego c, uno a la vez.
Al llamar next, la posición se mueve una fila a la vez.
Si llamo next y obtengo una a,
Entonces puedo enviar el mensaje upTo: un elemento
Este método devuelve todos los elementos que se encuentran entre la posición actual
y el elemento que entregue como parámetro.
Con a, estoy en la posición 1.
Si envío upTo: $d,
devuelve lo que hay entre la posición actual y d:
b y c
d es consumido por el stream.
Significa que el stream ahora se encuentra justo después de d.
d no se devuelve
stream position Devuelve la posición actual.
La posición comienza en 0.
0 se encuentra antes del primer elemento: 0, 1, 2, 3, 4.
Nos situamos antes de e y después de d.
Ahora si envío el mensaje upToEnd al stream, obtendré todos los elementos
ubicados entre la posición actual y el final de la secuencia:
eso es e y f
El stream mantiene una posición actual. Que puedo avanzar
gracias a algunos métodos.
También puede escribir en un stream.
El primer paso es crear el stream.
Con Array new: 6, Creo una tabla vacía de tamaño 6.
Envío el mensaje writeStream para crear un stream en esta tabla
para poder llenarlo gradualmente gracias a mi stream
Yo guardo el stream en la variable stream.
Empiezo enviando el mensaje nextPut: 1
que toma un elemento y lo agrega a la posición actual del stream.
Mi tabla ahora contiene 1 seguido de cinco celdas vacías.
El mensaje nextPutAll: toma una colección de objetos
que se anexan al stream.
Después de enviar nextPutAll: al stream,
Obtengo una matriz que contiene 1,
resultado del mensaje nextPut: anterior,
seguido de 4 8 2 6 7,
El resultado de nextPutAll:.
Los streams son especialmente útiles y eficaces
para leer y escribir colecciones de objetos.
También puedo escribir y leer los archivos.
Estoy mostrando un ejemplo de cómo escribir
en un archivo nuevo que no todavía no existe.
En el string (cadena de caracteres), Introduzco el nombre del archivo.
Al enviar al string el mensaje asFileReference,
creo una referencia a un archivo.
Este es un archivo que aún no existe, pero ya puedo obtener una referencia a el.
Tengo una referencia a un archivo, hello.txt.
Envío el mensaje writeStream
al archivo
para obtener una secuencia de escritura relacionado con este archivo inexistente.
Tan pronto como escribas en el stream, el archivo se creara
Ahora que tengo un stream, envío el mensaje nextPutAll: con una cadena (string).
Este mensaje escribe un carácter a la vez, cada elemento de la cadena.
"h" luego "e" luego "l", etc.
En el final,
Cierro el stream
para decirle al sistema operativo terminé de escribir en el archivo
y puede escribir todo en el sistema de almacenamiento
y cierre el puntero del archivo.
Ahora que escribí en el archivo, Puedo leerlo.
El nombre del archivo
se muestra como una cadena.
Con asFileReference, puedo crear una referencia a este archivo
Con readStream,
Puedo abrir un flujo de lectura,
una corriente leída cuando se trata de este archivo.
Con next, me entrega el primer elemento de la secuencia.
Escribí "¡Hello, Pharo!". El primer elemento es "H".
Con UpToEnd, obtengo todos los caracteres
entre la posición actual, Después de "H" y antes de "e",
y el final del archivo.
¡Obtengo "ello Pharo!" sin "H"
que ya tengo gracias al next anterior.
Uno puede crear colecciones usando streams
Es útil cuando quieres para crear colecciones
y necesitas código para elegir qué incluir gradualmente en ellos.
Quiero crear una OrderedCollection
enviando mensajes a un stream.
A partir de la clase OrderedCollection,
creo una nueva instancia
que convierto en un writeStream.
Gracias al mensaje nextPut:, Agrego 1 en el stream.
Si escribo stream contents,
Obtengo una instancia de la clase OrderedCollection
que contiene solo el valor 1.
Estas tres expresiones Se puede simplificar, como se muestra a continuación.
Puede enviar el mensaje streamContents:
a la clase en la que estamos interesados, que es OrderedCollection.
Envío contenido stream: a la OrderedCollection
Lo paso un bloque como parámetro que toma una secuencia como parámetro.
Dentro del bloque, uso el stream para completar gradualmente la colección.
Cuando el bloque termine, Recibo una colección
En el bloque, escribo stream nextPut: 1.
Agrego 1 a la secuencia.
Se agrega a la colección.
Cuando streamContents: se cierra, cuando esta expresión termine,
Obtendré una OrderedCollection que contiene 1
"streamContents:" es útil para crear colecciones desde cero.
En el curso, Aprendimos sobre la API de Stream.
Hay muchos métodos que puede aprender explorando las clases
Utilizando el navegador de código Nautilus.
Un stream puede leer y escribir en colecciones, en memoria,
archivos, la red, etc.
Un stream mantiene una posición actual.
La posición actual separa el pasado. de los elementos futuros.
Cada vez que escribe o lee desde el stream, la posición actual cambia.
Los streams también pueden ayudar a crear nuevas colecciones