 VB .NET - Usando a classe Stream
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:
| PublicSub 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 SubEnd 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 IfTry '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 ByteDim 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 TryEnd Sub 
 | 
A rotina IncluiTexto tem o seguinte código:
| PrivateShared 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.
| PublicSub 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 SubEnd 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
usandoStreams.zip
Eu sei é só VB .NET , mas eu gosto...

referências:
José Carlos Macoratti