﻿1
00:00:00,400 --> 00:00:05,360
Hola. En este curso,
Hablaré sobre los streams.

2
00:00:05,520 --> 00:00:07,840
Es una característica básica de Pharo.

3
00:00:09,240 --> 00:00:13,480
Veremos qué son los streams, cómo usarlos
y cuando pueden ser útiles.

4
00:00:14,880 --> 00:00:16,200
¿Qué es un stream?

5
00:00:16,360 --> 00:00:17,840
Es un objeto

6
00:00:18,000 --> 00:00:22,200
que permite iterar
sobre una colección de elementos,

7
00:00:22,360 --> 00:00:24,240
una secuencia de elementos

8
00:00:24,400 --> 00:00:28,040
Esta secuencia podría ser
una colección en memoria,

9
00:00:28,800 --> 00:00:34,320
un flujo de red, un archivo, etc.

10
00:00:36,120 --> 00:00:39,320
Un stream mantiene la posición actual
en memoria.

11
00:00:40,000 --> 00:00:44,200
Mientras usa el stream,
puede avanzar o retroceder,

12
00:00:44,360 --> 00:00:46,920
leer o escribir elementos
en el stream

13
00:00:47,600 --> 00:00:50,760
Una descripción general de la API de los streams.

14
00:00:50,920 --> 00:00:54,680
Para crear un stream,
hay algunos objetos

15
00:00:55,520 --> 00:01:00,200
sobre los cuales puede usar los mensajes
readStream y writeStream

16
00:01:01,000 --> 00:01:02,880
para crear streams

17
00:01:03,040 --> 00:01:06,800
(de un archivo o una colección,
por ejemplo).

18
00:01:07,880 --> 00:01:10,480
Puede crear secuencias de esta manera.

19
00:01:11,760 --> 00:01:16,560
Este mensaje, streamContents:,
se envía a una colección

20
00:01:16,720 --> 00:01:19,120
y toma un bloque como parámetro,
que recibe un stream.

21
00:01:19,680 --> 00:01:23,840
El uso de un stream dentro de este bloque
crea una colección

22
00:01:24,000 --> 00:01:27,800
que sera devuelta por el método.

23
00:01:27,960 --> 00:01:30,400
Veremos cómo usar este método.
en el final.

24
00:01:31,440 --> 00:01:35,160
En este caso, pregunte directamente a una clase,

25
00:01:35,320 --> 00:01:38,680
ya sea readStream, writeStream,
o (Read/Write)Stream,

26
00:01:38,840 --> 00:01:42,640
de crear una nueva instancia
sobre una colección

27
00:01:44,840 --> 00:01:50,200
Estos tres métodos pueden leer
uno o varios elementos

28
00:01:51,240 --> 00:01:53,320
hasta cierto punto.

29
00:01:54,080 --> 00:01:56,280
Estos dos elementos

30
00:01:56,440 --> 00:02:00,640
escriben un elemento o una colección
de elementos en la secuencia (stream).

31
00:02:00,800 --> 00:02:04,440
Estos son algunos ejemplos a través de los cuales
Puedes leer un stream.

32
00:02:04,600 --> 00:02:06,600
Primero, creamos un stream.

33
00:02:06,760 --> 00:02:11,640
Estoy creando un stream en lectura
a partir de una colección

34
00:02:11,800 --> 00:02:15,760
La colección contiene
todas las letras entre a y f.

35
00:02:15,920 --> 00:02:19,840
Hay un carácter
por cada elemento de la colección.

36
00:02:20,000 --> 00:02:24,520
Creamos un stream sobre la colección.
Echaremos un vistazo a los caracteres uno a uno.

37
00:02:25,360 --> 00:02:27,760
Una vez que el flujo (stream) esté listo,

38
00:02:28,400 --> 00:02:31,040
puede comenzar
enviando el mensaje next

39
00:02:31,200 --> 00:02:34,720
que devolverá el elemento
situado justo después de la posición actual

40
00:02:34,880 --> 00:02:36,800
cuando se inicializa el stream.

41
00:02:36,960 --> 00:02:40,200
La posición actual es 0,
Al comienzo del stream.

42
00:02:40,360 --> 00:02:45,120
Next devuelve el primer elemento,
el cual es el carácter a.

43
00:02:45,920 --> 00:02:47,880
Si llamo next en este momento,

44
00:02:48,040 --> 00:02:51,800
Conseguiré un b luego c, uno a la vez.

45
00:02:51,960 --> 00:02:56,920
Al llamar next, la posición se mueve
una fila a la vez.

46
00:02:57,760 --> 00:03:01,440
Si llamo next y obtengo una a,

47
00:03:01,600 --> 00:03:06,480
Entonces puedo enviar el mensaje upTo:
un elemento

48
00:03:06,640 --> 00:03:10,720
Este método devuelve todos los elementos
que se encuentran entre la posición actual

49
00:03:10,880 --> 00:03:13,520
y el elemento que entregue como parámetro.

50
00:03:13,680 --> 00:03:17,040
Con a, estoy en la posición 1.

51
00:03:17,920 --> 00:03:19,800
Si envío upTo: $d,

52
00:03:19,960 --> 00:03:23,320
devuelve lo que hay entre
la posición actual y d:

53
00:03:23,480 --> 00:03:26,000
b y c

54
00:03:26,600 --> 00:03:28,720
d es consumido por el stream.

55
00:03:28,880 --> 00:03:32,440
Significa que el stream
ahora se encuentra justo después de d.

56
00:03:32,600 --> 00:03:33,800
d no se devuelve

57
00:03:34,440 --> 00:03:38,760
stream position
Devuelve la posición actual.

58
00:03:38,920 --> 00:03:40,720
La posición comienza en 0.

59
00:03:40,880 --> 00:03:46,400
0 se encuentra antes del primer elemento:
0, 1, 2, 3, 4.

60
00:03:46,560 --> 00:03:49,120
Nos situamos antes de e y después de d.

61
00:03:50,760 --> 00:03:55,840
Ahora si envío el mensaje upToEnd
al stream, obtendré todos los elementos

62
00:03:56,000 --> 00:04:00,040
ubicados entre la posición actual
y el final de la secuencia:

63
00:04:00,200 --> 00:04:03,400
eso es e y f

64
00:04:03,560 --> 00:04:07,520
El stream mantiene una posición actual.
Que puedo avanzar

65
00:04:07,680 --> 00:04:09,360
gracias a algunos métodos.

66
00:04:09,520 --> 00:04:11,680
También puede escribir en un stream.

67
00:04:11,840 --> 00:04:14,240
El primer paso es crear el stream.

68
00:04:15,880 --> 00:04:19,840
Con Array new: 6,
Creo una tabla vacía de tamaño 6.

69
00:04:20,640 --> 00:04:24,240
Envío el mensaje writeStream
para crear un stream en esta tabla

70
00:04:24,400 --> 00:04:27,600
para poder llenarlo gradualmente
gracias a mi stream

71
00:04:27,760 --> 00:04:30,320
Yo guardo el stream
en la variable stream.

72
00:04:30,480 --> 00:04:33,280
Empiezo enviando el mensaje nextPut: 1

73
00:04:33,440 --> 00:04:38,360
que toma un elemento y lo agrega
a la posición actual del stream.

74
00:04:38,520 --> 00:04:43,800
Mi tabla ahora contiene 1
seguido de cinco celdas vacías.

75
00:04:46,280 --> 00:04:50,320
El mensaje nextPutAll:
toma una colección de objetos

76
00:04:50,480 --> 00:04:53,360
que se anexan al stream.

77
00:04:54,240 --> 00:04:57,800
Después de enviar nextPutAll: al stream,

78
00:04:58,600 --> 00:05:01,000
Obtengo una matriz que contiene 1,

79
00:05:01,880 --> 00:05:04,480
resultado del mensaje nextPut: anterior,

80
00:05:04,640 --> 00:05:06,880
seguido de 4 8 2 6 7,

81
00:05:09,240 --> 00:05:11,120
El resultado de nextPutAll:.

82
00:05:11,280 --> 00:05:14,880
Los streams son especialmente útiles
y eficaces

83
00:05:15,040 --> 00:05:18,560
para leer
y escribir colecciones de objetos.

84
00:05:19,400 --> 00:05:21,600
También puedo escribir y leer los archivos.

85
00:05:21,760 --> 00:05:25,200
Estoy mostrando un ejemplo de cómo escribir

86
00:05:25,360 --> 00:05:27,440
en un archivo nuevo que no todavía no existe.

87
00:05:29,880 --> 00:05:32,480
En el string (cadena de caracteres),
Introduzco el nombre del archivo.

88
00:05:33,640 --> 00:05:39,360
Al enviar al string
el mensaje asFileReference,

89
00:05:39,520 --> 00:05:41,720
creo una referencia a un archivo.

90
00:05:41,880 --> 00:05:46,040
Este es un archivo que aún no existe,
pero ya puedo obtener una referencia a el.

91
00:05:46,640 --> 00:05:49,440
Tengo una referencia a un archivo, hello.txt.

92
00:05:50,720 --> 00:05:52,680
Envío el mensaje writeStream

93
00:05:54,120 --> 00:05:55,440
al archivo

94
00:05:55,600 --> 00:06:00,760
para obtener una secuencia de escritura
relacionado con este archivo inexistente.

95
00:06:00,920 --> 00:06:05,240
Tan pronto como escribas en el stream,
el archivo se creara

96
00:06:06,240 --> 00:06:11,480
Ahora que tengo un stream, envío
el mensaje nextPutAll: con una cadena (string).

97
00:06:11,640 --> 00:06:16,720
Este mensaje escribe un carácter
a la vez, cada elemento de la cadena.

98
00:06:16,880 --> 00:06:19,400
"h" luego "e" luego "l", etc.

99
00:06:20,560 --> 00:06:21,560
En el final,

100
00:06:23,320 --> 00:06:24,960
Cierro el stream

101
00:06:25,120 --> 00:06:29,720
para decirle al sistema operativo
terminé de escribir en el archivo

102
00:06:29,880 --> 00:06:33,360
y puede escribir todo
en el sistema de almacenamiento

103
00:06:33,520 --> 00:06:37,360
y cierre el puntero del archivo.

104
00:06:37,520 --> 00:06:42,400
Ahora que escribí en el archivo,
Puedo leerlo.

105
00:06:42,560 --> 00:06:46,720
El nombre del archivo

106
00:06:46,880 --> 00:06:48,680
se muestra como una cadena.

107
00:06:50,880 --> 00:06:56,200
Con asFileReference, puedo crear
una referencia a este archivo

108
00:06:57,800 --> 00:06:59,440
Con readStream,

109
00:06:59,600 --> 00:07:02,240
Puedo abrir un flujo de lectura,

110
00:07:02,400 --> 00:07:06,160
una corriente leída
cuando se trata de este archivo.

111
00:07:07,840 --> 00:07:10,680
Con next, me entrega
el primer elemento de la secuencia.

112
00:07:10,840 --> 00:07:14,920
Escribí "¡Hello, Pharo!".
El primer elemento es "H".

113
00:07:15,600 --> 00:07:19,000
Con UpToEnd, obtengo todos los caracteres

114
00:07:19,160 --> 00:07:22,400
entre la posición actual,
Después de "H" y antes de "e",

115
00:07:22,560 --> 00:07:25,840
y el final del archivo.

116
00:07:26,000 --> 00:07:28,800
¡Obtengo "ello Pharo!" sin "H"

117
00:07:28,960 --> 00:07:33,160
que ya tengo gracias al next anterior.

118
00:07:33,320 --> 00:07:36,960
Uno puede crear colecciones
usando streams

119
00:07:37,120 --> 00:07:39,880
Es útil cuando quieres
para crear colecciones

120
00:07:40,040 --> 00:07:44,320
y necesitas código para elegir
qué incluir gradualmente en ellos.

121
00:07:45,480 --> 00:07:48,680
Quiero crear una OrderedCollection

122
00:07:50,840 --> 00:07:53,160
enviando mensajes a un stream.

123
00:07:53,320 --> 00:07:56,240
A partir de la clase OrderedCollection,

124
00:07:56,960 --> 00:07:58,640
creo una nueva instancia

125
00:07:59,240 --> 00:08:01,760
que convierto en un writeStream.

126
00:08:02,520 --> 00:08:06,280
Gracias al mensaje nextPut:,
Agrego 1 en
 el stream.

127
00:08:06,440 --> 00:08:10,200
Si escribo stream contents,

128
00:08:10,360 --> 00:08:13,440
Obtengo una instancia
de la clase OrderedCollection

129
00:08:13,600 --> 00:08:15,520
que contiene solo el valor 1.

130
00:08:16,240 --> 00:08:19,720
Estas tres expresiones
Se puede simplificar, como se muestra a continuación.

131
00:08:20,720 --> 00:08:23,240
Puede enviar el mensaje streamContents:

132
00:08:23,400 --> 00:08:26,960
a la clase en la que estamos interesados,
que es OrderedCollection.

133
00:08:27,120 --> 00:08:29,960
Envío contenido stream:
a la OrderedCollection

134
00:08:30,120 --> 00:08:35,000
Lo paso un bloque como parámetro
que toma una secuencia como parámetro.

135
00:08:35,160 --> 00:08:39,160
Dentro del bloque, uso el stream
para completar gradualmente la colección.

136
00:08:39,320 --> 00:08:41,760
Cuando el bloque termine,
Recibo una colección

137
00:08:42,320 --> 00:08:46,120
En el bloque, escribo stream nextPut: 1.

138
00:08:46,880 --> 00:08:49,720
Agrego 1 a la secuencia.

139
00:08:49,880 --> 00:08:51,880
Se agrega a la colección.

140
00:08:52,040 --> 00:08:55,880
Cuando streamContents: se cierra,
cuando esta expresión termine,

141
00:08:56,040 --> 00:08:58,840
Obtendré una OrderedCollection
que contiene 1

142
00:08:59,000 --> 00:09:03,720
"streamContents:" es útil
para crear colecciones desde cero.

143
00:09:04,400 --> 00:09:07,600
En el curso,
Aprendimos sobre la API de Stream.

144
00:09:07,760 --> 00:09:11,920
Hay muchos métodos que puede aprender
explorando las clases

145
00:09:12,080 --> 00:09:14,280
Utilizando el navegador de código Nautilus.

146
00:09:14,440 --> 00:09:18,560
Un stream puede leer
y escribir en colecciones, en memoria,

147
00:09:18,720 --> 00:09:22,480
archivos, la red, etc.

148
00:09:23,640 --> 00:09:26,160
Un stream mantiene una posición actual.

149
00:09:27,040 --> 00:09:31,440
La posición actual separa el pasado.
de los elementos futuros.

150
00:09:31,600 --> 00:09:36,000
Cada vez que escribe o lee desde
el stream, la posición actual cambia.

151
00:09:37,200 --> 00:09:40,480
Los streams también pueden ayudar
a crear nuevas colecciones
