La clase StreamReader

La clase StreamReader

Un objeto StreamReader realiza operaciones de lectura de texto sobre un archivo. El proceso que debemos llevar a cabo para leer el contenido de un Stream de lectura es muy similar al

de escritura: instanciar el objeto con uno de sus constructores, abriendo un archivo para leer; ejecutar alguno de los métodos de lectura del StreamReader, y cerrar el objeto con Close( ).

Entre los métodos de lectura de este objeto, tenemos ReadLine( ), que devuelve una línea del archivo; y ReadToEnd( ), que devuelve el resto del contenido del archivo, desde el punto en el que se encontrara el Stream al realizar la última lectura. Veamos unos ejemplos en el Código fuente 414.

Dim srLector As StreamReader = New StreamReader("\pruebas\NOTAS.txt")

Console.WriteLine("**Leer una primera línea**") Dim Linea As String Linea = srLector.ReadLine() Console.WriteLine("La línea contiene --> {0}", Linea)

Console.WriteLine() Console.WriteLine("**Ahora leemos el resto del archivo**") Dim Texto As String Texto = srLector.ReadToEnd() Console.WriteLine("El texto restante contiene --> {0}", Texto)

srLector.Close()

' *********************************************** ' leer línea a línea mediante un bucle

Dim srLector As StreamReader = New StreamReader("\pruebas\Datos.txt") Dim Linea As String Dim ContadorLin As Integer = 1 Linea = srLector.ReadLine() Do While Not (Linea Is Nothing)

Console.WriteLine("Línea: {0} - Contenido: {1}", ContadorLin, Linea) ContadorLin += 1 Linea = srLector.ReadLine()

Loop

Código fuente 414

© Grupo EIDOS 27. Operaciones de entrada y salida (I/O). Gestión del sistema de archivos

Otro de los métodos de lectura es ReadBlock( ), que recibe como parámetro un array de tipo Char, sobre el que se depositarán una cierta cantidad de caracteres leídos del archivo. En el segundo parámetro de este método indicamos la posición del array desde la que se comenzarán a guardar los caracteres. En el tercer parámetro, el número de caracteres a leer.

El método Read( ), también permite realizar una lectura igual que ReadBlock( ), pero en el caso de no utilizar parámetros, devuelve un valor numérico, correspondiente al código del carácter que acaba de leer. Cuando llega al final del Stream, devuelve –1.

Para convertir de nuevo a carácter los valores que devuelve Read( ), debemos pasar estos valores a un array de tipo Byte, y después, utilizando un objeto ASCIIEncoding, mediante su método GetString( ), pasaríamos el array a una cadena. Veamos unos ejemplos de estos métodos en el Código fuente 415.

Imports System.IO Imports System.Text

Module Module1 Sub Main() ' crear un Stream de lectura Dim srLector As StreamReader = New StreamReader("\pruebas\NOTAS.txt")

' obtener valores del Stream con el método ReadBlock() ' ---------------------------------------------------- ' crear un array Char que contendrá los caracteres leídos Dim Caracteres(15) As Char ' leemos 16 caracteres del archivo y los pasamos al array ' comenzando a grabarlos a partir de su posición 0 srLector.ReadBlock(Caracteres, 0, 16) ' pasamos el array de valores Char a String mediante ' el constructor de la clase String que recibe como ' parámetro un array Char Dim Parte1 As String = New String(Caracteres) Console.WriteLine("Resultado de la lectura con ReadBlock()") Console.WriteLine(Parte1)

Console.WriteLine()

' obtener valores del stream con el método Read() ' ----------------------------------------------- Dim Valor As Integer Dim Codigos() As Byte

' vamos a ir volcando en un bucle los códigos de carácter ' leidos desde el archivo a un array Byte Valor = srLector.Read() While (Valor <> -1) ' cuando lleguemos al final, obtendremos -1

If Codigos Is Nothing Then ReDim Codigos(0) Else ReDim Preserve Codigos(Codigos.GetUpperBound(0) + 1) End If

Codigos(Codigos.GetUpperBound(0)) = Valor Valor = srLector.Read()

End While

Dim Codificador As New ASCIIEncoding() Dim Parte2 As String ' con el objeto ASCIIEncoding, método GetString(), ' obtenemos una cadena, pasando como parámetro un array ' de tipos Byte

Programación con Visual Basic .NET © Grupo EIDOS

Parte2 = Codificador.GetString(Codigos) Console.WriteLine("Resultado de la lectura con ReadBlock()") Console.WriteLine(Parte2)

Console.ReadLine() End Sub End Module

Código fuente 415

Finalmente, el método Peek( ), al igual que Read( ), devuelve el siguiente valor disponible del Stream, pero sin extraerlo del búfer, con lo que deberemos utilizar alguno de los métodos anteriormente descritos para realizar una lectura real.

Las clases StringWriter y StringReader

Estas clases proporcionan la misma funcionalidad que StreamWriter y StreamReader, con la diferencia

de que StringWriter trabaja con un objeto StringBuilder como almacén de datos, mientras que StringReader utiliza un String para leer su contenido.