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