VB .NET - 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:
BufferedStream
:
Fornece uma camada buferizada em outro stream para aumentar o desempenho.FileStream
:
Fornece uma forma de ler e escrever arquivos.MemoryStream
:
Fornece um stream usando a memória como forma de armazenamento.NetworkStream
:
Fornece uma forma de acessar dados em uma rede.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)
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 IfTry ' 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