VB 2005 - Usando a classe Stream


A classe Stream define propriedades e métodos que permitem realizar operações genéricas com fluxo de bytes (streams) : ler , escrever, etc.

Nota: Um stream pode ser considerado um  fluxo sequêncial de bytes com um arquivo, um dispositivo de entrada/saida, um processo de comunicação entre dois pontos ou um socket TCP/IP. (Após esta explicação eu vou continuar a usar a palavra stream na sua forma original sem tradução.)

Usar Streams envolve as seguintes operações fundamentais

Exemplo de leietura de um arquivo texto : StreamReader Exemplo de escrita em um arquivo texto: StreamWriter
Public Shared Sub Main()
Try
' Cria uma instância de um StreamReader para ler um arquivo                         
Using sr As StreamReader = New StreamReader("Macoratti.txt")
Dim line As String
' Lê e exibe as linhas do aruqivo até o fim
Do
line = sr.ReadLine()
Console.WriteLine(line)
Loop Until line Is Nothing
sr.Close()
End Using
Catch E As Exception
' Exibe mensagem de erro
Console.WriteLine("O arquivo não pode ser lido")
Console.WriteLine(E.Message)
End Try
End Sub
Public Shared Sub Main()
' Cria uma instância de um StreamWriter para escrever para um arquivo
Using sw As StreamWriter = New StreamWriter("Macoratti.txt")
' Inclui algum texto
sw.Write("Este é um teste")
sw.WriteLine("-------------------")
' Outros objetos podem ser escritos no arquivo
sw.Write("Data : ")
sw.WriteLine(DateTime.Now)
sw.Close()
End Using
End Sub

A classe Stream é abstrata , e por isso não pode ser instanciada diretamente. Ao implementar uma classe derivada de Stream você deverá fornecer implementações para os métodos Read e Write.

A classe Stream é implementada pelas seguintes classes:

  1. BufferedStream: Fornece uma camada buferizada em outro stream para aumentar o desempenho.
  2. FileStream: Fornece uma forma de ler e escrever arquivos.
  3. MemoryStream: Fornece um stream usando a memória como forma de armazenamento.
  4. NetworkStream:  Fornece uma forma de acessar dados em uma rede.
  5. CryptoStream:  Fornece uma forma de suprir dados para uma operação de criptografia.

De forma geral operações com stream envolvem operações de leitura , escrita e procura. ( read, write , seek )

- Principais propriedades da classe Stream:

Propriedade Descrição
CanRead Retorna True se o stream suporta a leitura.
CanSeek Retorna True se o stream suporta a busca para um posição particular do stream.
CanTimeout Retorna True se o stream suporta timeout expiração de tempo para operações de leitura e escrita.
CanWrite Retorna True se o stream suporta escrita.
Length Retorna o número de bytes de um stream.
Position Retorna a posição atual do Stream. Para um stream que suporta a busca, o programa pode definir este valor para se mover para uma posição particular.
ReadTimeout Determina o número de mili-segundos que uma operação de leitura irá esperar até expirar.
WriteTimeout Determina o número de mili-segundos que uma operação de escrita irá esperar até expirar.

- Métodos mais úteis da classe Stream:

Metodo Propósito
BeginWrite Inicia uma escrita assíncrona.
BeginRead Inicia uma leitura assíncrona
Close Fecha o stream e libera qualquer recurso usado.
EndRead Aguarda que uma leitura assíncrona termine.
EndWrite Encerra uma escrita assíncrona.
Flush Libera os dados de um buffer de stream em um meio de armazenamento.(arquivo, memória, etc.).
Read Lê bytes de um stream e avança a posição para o número de bytes.
ReadByte Lê um byte de um stream e avança a sua posição em um byte.
Seek Se o stream suporta a operação de busca , define a posição no stream.
SetLength Define o comprimento do stream.Se o stream atual é maior que o novo tamanho definido ele é truncado. Se o stream for menor ele é expandido.
Write Escreve bytes em um stream e avança a posição atual pelo número de bytes escritos.
WriteByte Escreve um byte em um stream e avança a posição atual em um byte.

Vejamos a seguir exemplos usando a classe FileStream usando o Visual Basic 2005 Express Edition.

Abra o VB 2005 Express e crie um novo projeto do tipo Windows Forms com o nome usandoStreams;

No formulário padrão padrão inclua os controles : TextBox, Label, Button e ListBox conforme o leiaute abaixo:

Declare os seguintes namespaces no projeto:

Imports System
Imports
System.IO
Imports
System.Text

No evento Click de cada um dos Botões de comando inclua o código abaixo:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Me.lePrincipal()
End
Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    testaStream()
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
  
Me.Close()
End Sub

Agora vamos definir as rotinas que usa a classe Stream para realizar operações com arquivos e diretórios. Digite o código abaixo no formulário:

Public Sub testaStream()

Dim Origem As String = ""

Dim arquivo As String = ""

Dim arqDestino As String = ""

 

'Define os diretorios que vamos tratar

If txtOrigem.Text <> String.Empty And txtDestino.Text <> String.Empty Then

    Origem = txtOrigem.Text

    arquivo = txtArquivo.Text

    arqDestino = Origem + "/" + arquivo

Else

   MsgBox("Informe o diretório de origem e o nome do arquivo. (Ex: c:\teste , Macoratti.txt)")

   Exit Sub

End If

 

' Determina se o diretório existe

If Directory.Exists(Origem) = False Then

   ' Cria o diretório

    Directory.CreateDirectory(Origem)

End If

 

' Deleta o arquivo se ele existir

If File.Exists(arqDestino) Then

    File.Delete(arqDestino)

End If

Try

 

'Cria o arquivo

Dim fs As FileStream = File.Create(arqDestino)


incluiTexto(fs,
"Este texto foi incluido no arquivo criado ")

 

fs.Close()

'Abre o stream e le o seu conteudo novamente

fs = File.OpenRead(arqDestino)

Dim b(1024) As Byte

Dim temp As UTF8Encoding = New UTF8Encoding(True)

Do While fs.Read(b, 0, b.Length) > 0

    lstbStreams.Items.Add(temp.GetString(b))

Loop

fs.Close()

Catch ex As Exception

    MsgBox("O processo falhou : " & ex.Message)

End Try

End Sub

 

A rotina IncluiTexto tem o seguinte código:

Private Shared Sub incluiTexto(ByVal fs As FileStream, ByVal value As String)

    Dim info As Byte() = New UTF8Encoding(True).GetBytes(value)

    fs.Write(info, 0, info.Length)

End Sub

A seguir defina através do código abaixo a rotina lePrincipal que irá criar diretórios e arquivos.

Public Sub lePrincipal()

 

Dim Origem As String = ""

Dim Destino As String = ""

Dim arquivo As String = ""

 

'Define os diretorios que vamos tratar

If txtOrigem.Text <> String.Empty And txtDestino.Text <> String.Empty Then

   Origem = txtOrigem.Text

    Destino = txtDestino.Text

    arquivo = txtArquivo.text

Else

    MsgBox("Informe o diretório de origem e destino. (Ex: c:\teste , c:\teste1)")

    Exit Sub

End If

 

Try

   ' Determina se o diretório existe

    If Directory.Exists(Origem) = False Then

     ' Cria o diretório

       Directory.CreateDirectory(Origem)

       lstbStreams.Items.Add("Diretorio : " & Origem & " criado")

    End If

 

    If Directory.Exists(Destino) Then

         ' Deleta o diretório de Destino para certificar que o mesmo não existe

        Directory.Delete(Destino, True)

     End If

 

    ' Move o diretório

    Directory.Move(Origem, Destino)

    lstbStreams.Items.Add("Diretorio : " & Origem & " movido para : " & Destino)

 

     'Cria um arquivo no diretório

     File.CreateText(Destino + arquivo)

     lstbStreams.Items.Add("Arquivo criado : " & Destino + arquivo)

 

      'Conta os arquivos do diretório

    lstbStreams.Items.Add("Número de arquivos em : " & Destino & " é igual a : " & Directory.GetFiles(Destino).Length)

Catch e As Exception

    MsgBox("O processo falhou : " & e.ToString())

End Try

 

End Sub

O código acima usa os métodos : Exists, CreateDirectory, Delete, Move da classe Directory. Creio que não há necessidade de comentar o código

Pegue o projeto completo aqui :  usandoStreams.zip

Eu sei é só VB .NET , mas eu gosto...

referências:


José Carlos Macoratti