Primeiras aulas do curso VB.NET com Windows Forms Parte 10: entrada e saída (I/O) com streams

VB.NET com Windows Forms Parte 10: entrada e saída (I/O) com streams

Lendo arquivos de texto - Introdução

Olá, gente. Meu nome é Victorino Vila e bem-vindos a mais um curso de visual basic .net. Note esse arquivo que abri dentro do meu notepad. É um arquivo que me lista dados de contas correntes do meu banco Bytebank. Até agora a gente tem trabalhado com as contas correntes dentro do nosso código, mas na prática os dados que envolvem nossas aplicações ficam armazenados externamente, no disco hd ou sd e por aí vai, mas em algum ambiente externo à minha aplicação. E o fato de ter que ler ou gravar informações desses arquivos externos é uma funcionalidade muito importante em qualquer linguagem de programação.

O foco do nosso curso será esse, iremos aprender a trabalhar com entradas e saídas de arquivos dentro do visual basic .net, e vamos inicialmente aprender uma classe chamada stream, que permite capturar bytes do meu arquivo externo. Vamos aprender a manipular esses bytes, seja para ler dados do arquivo ou para gravar dados neste arquivo.

Mas normalmente os bytes são coisas que a gente não entende muito. Se a gente olhar o resultado da leitura desses bytes tem uma série de números que estão muito relacionados com aquelas tabelas de conversão ascii que converte bytes em textos. Claro que quando a gente lê alguma coisa e exibe para o usuário não vou exibir os bytes, preciso exibir texto, a informação que está gravada no arquivo para ele olhe e tome a decisão.

Por isso vamos aprender também transformações que fazem a conversão automaticamente de bytes em caracteres legíveis para os humanos através de tabelas de conversão. Vamos ver que essa manipulação de bytes a gente tem que tomar cuidado, porque estamos pegando byte a byte, mas felizmente vamos ver depois que o .net possui classes específicas para manipular esses dados sem a necessidade da gente ter que controlar o fluxo de bytes.

Também vamos ver que quando a gente escreve dados no arquivo normalmente a gente escreve com o formato texto porque posso abrir aquele arquivo através de outro editor para ler o conteúdo, mas às vezes não há necessidade de ter que salvar o arquivo de maneira legível, porque somente minha aplicação vai ler. Vamos aprender, por exemplo, como salvar os dados dentro de um arquivo no formato binário.

Finalmente, vamos pegar uma das aplicações do nosso banco Bytebank, que é uma aplicação que permite incluir ou excluir contas correntes através de um formulário e vamos implementar todo o conhecimento que tivemos nesse curso, principalmente o de salvar arquivos externos para melhorar a aplicação do Bytebank e fazer com que as modificações feitas em um formulário da aplicação possam ser salvas e posteriormente recuperadas pela própria aplicação.

Temos bastante coisa para aprender, espero que vocês gostem deste treinamento. Um abraço.

Lendo arquivos de texto - Entendendo o fluxo de dados

Vamos continuar iniciando mais um curso de visual basic. No link relacionado a este vídeo vocês podem baixar o projeto inicial do curso, que na verdade é o projeto final do curso passado de visual basic. Se você não fez o curso passado não tem problema, apesar de ser um pré-requisito esse assunto que vamos falar é um pouco diferente do assunto que vimos no curso anterior.

Eu já baixei o arquivo, o link, ele é um arquivo compactado. Vou copiar ele e colar no meu diretório onde todos os meus projetos em visual studio estão sendo salvos. Vou abrir minha solução Bytebank.

Está aqui, recuperado. Vou me certificar que o projeto Bytebank sistema agência é o projeto padrão, vou selecionar o frm principal 01 como formulário inicial do projeto. Vou executar e relembrando tenho nessa opção manutenção cc manipulação list view um ambiente onde tenho seis contas correntes que aparecem numa lista, e é a partir dessa lista inicial que posso incluir novas contas, excluir novas contas ou então ordenar por algum tipo de critério. Quem fez cursos anteriores a este se lembra quando construímos essa aplicação.

Mas tem uma coisa que vou mostrar para vocês, vai ser a introdução para esse curso, que ainda não está muito legal nessa e em outras aplicações que fizemos até agora com as entidades do banco Bytebank.

Vou parar o código, vou abrir o formulário desta aplicação. No caso, é o frm manutenção cc list view. Vou dar botão direito do mouse e exibir código fonte. Vamos olhar a aplicação. Relembrando, declaro uma variável do tipo lista de contas correntes e nessa inicialização contas vou inicializar as contas correntes.

Note que inicializei forçando as contas que foram inicializadas. Coloquei aqui 27744323, um nome, a mesma agência em outra conta. Ou seja, esses seis correntistas criei no programa, mas o próprio programa leu do meu código fonte essas seis contas correntes e colocou na lista inicial para eu poder trabalhar.

Em um programa real não é assim que funciona. A lista de contas correntes iniciais que vão ser exibidas quando olho a aplicação não está salva no código, está salva externamente. Normalmente em um banco de dados ou um arquivo externo. E aí quando minha aplicação vai ser inicializada a primeira coisa que tenho que fazer é ler essa informação, esse arquivo externo, ou desse banco de dados, exibir essa posição inicial, e na medida que vou criando ou incluindo contas correntes devo atualizar esse arquivo externo, seja no momento em que faço a operação, em algum botão de salvar que eu coloque ou até mesmo salvo no arquivo externo quando acabar de manipular a aplicação.

Independente de qualquer que seja as coisas, em um programa real trabalho com as minhas contas correntes, minhas agências, meus clientes. Todas as entidades do banco Bytebank armazenadas externamente no meu disco, seja no banco de dados, como falei, seja em um arquivo externo.

Vamos dar ênfase neste treinamento a arquivos externos, e dentro dessa aplicação que vocês baixaram tem um arquivo chamado tempo.txt. Vou abrir esse arquivo com o notepad e note que tenho, na verdade, uma lista de contas correntes onde basicamente a primeira informação que tenho é o código da agência, depois o número da conta, saldo atual, CPF do cliente, e o nome do cliente.

O que acontece é que quando eu for manipular essa informação, vou carregar para a minha lista de trabalho essa lista de contas correntes que estão salvas externamente. Agora, como faço essa carga? É feita de uma vez só? Qual o tamanho do arquivo? Se a gente olhar esse arquivo tem 37kb. Armazenar na memória do computador 37kb é uma coisa simples. Esse meu computador que estou trabalhando tem de memória 16gb, então 37kb é nada para colocar tudo em memória.

Mas na verdade isso é um exemplo muito simples do nosso treinamento. Imagine que tenho um arquivo muito grande, com milhões de registros, ou digamos que esteja abrindo não o arquivo tipo texto, mas abrindo um arquivo de vídeo, que normalmente tem um tamanho muito grande.

Quando trabalhamos com arquivos externos não jogamos tudo em memória. A gente vai lendo aos poucos. O que vamos fazer de certa maneira é que não vou carregar todos esses dados, instanciar eles em memória. Vou ler a linha, ou parte em parte do arquivo, não importa se é a linha ou determinado grupo de bytes que vou lendo, e na medida que vou lendo vou instanciar. Leio um pouco e instancio, leio um pouco e instancio.

A mesma maneira no vídeo. Se eu vier no site da Alura, vou pegar um curso qualquer, Análise de Dados com R. Quando eu vou visualizar um vídeo, por exemplo, minha barra está azul até aqui porque já vi o vídeo, mas tenho uma barra mais ou menos cinza que é o que está sendo carregado. Não preciso carregar todo o vídeo primeiro para poder assistir. Vou pegando ele e assistindo.

À medida que ele vai chegando na minha máquina já vou assistindo. A analogia com o vídeo é a mesma coisa que fizemos com os arquivos. Quando leio o arquivo não vou ler ele todo para depois trabalhar. Vou ler aos poucos e à medida em que vou lendo já vou fazendo os processamentos. É assim que a gente trabalha com arquivos externos.

Em primeiro lugar, queria mostrar para vocês como funciona esse fluxo de leitura de dados que estão externos ao meu programa e da importância deles, que evita, por exemplo, isso que estamos fazendo desde o primeiro curso de visual basic .net, que é colocar no código os dados iniciais das nossas aplicações. É isso, gente, até o próximo vídeo.

Lendo arquivos de texto - Criando um FileStream

Vamos começar a preparar nosso programa para ler os dados do nosso arquivo tempo.txt. No nosso formulário vamos clicar no projeto Bytebank sistema agência, botão direito do mouse, vou adicionar um novo item e adicionar um novo formulário Windows forms chamado frm entrada saída. Vou adicionar esse formulário vazio e vamos inserir nele um botão. Vou em caixa de ferramentas, todos os Windows forms, vou escolher o botão e deixar em um tamanho maior.

Vamos primeiro no nosso projeto Bytebank sistema agência, botão direito do mouse, propriedades, vamos colocar o frm entrada e saída como sendo o formulário de inicialização da aplicação. Só para ver se está funcionando vou clicar em iniciar e nosso formulário aparece sem nenhuma formatação. Vamos usar ele apenas para começar a entender os comandos de manipulação de arquivos através do visual basic .net.

Voltando ao modo designer do frm entrada e saída vou dar um duplo clique do botão e temos nosso código que vamos trabalhar aprendendo alguns comandos. É meio óbvio, quando vamos ler dados de um arquivo a primeira coisa que precisamos saber é onde está esse arquivo. Ele está gravado em algum lugar do meu disco, do computador, da rede. Coloco uma variável aqui chamada endereço do arquivo, vai ser uma string.

Se eu olhar, meu arquivo tem esse diretório aqui em cima. Então, vou copiar esse caminho, colar aqui e dar barra tempo.txt. Mas claro, nem todo mundo está gravando o arquivo tempo nesse diretório, se vocês estão fazendo o exemplo junto comigo através do vídeo vocês devem ter salvo esse arquivo tempo em outro diretório completamente diferente do que estou colocando.

Para a gente fazer uma coisa padronizada, podemos apenas dizer o nome do arquivo, sem especificar o caminho. Para isso, o arquivo precisa estar em um local específico, ele precisa estar no mesmo lugar onde está o executável da aplicação. Se o arquivo tempo.txt estiver no mesmo diretório que o executável da aplicação, quando o programa for rodar ele vai achar o nome do arquivo e vai automaticamente procurar no mesmo diretório onde está o executável da aplicação.

Lembrando que meu projeto está aqui, meu executável fica dentro do Bytebank sistemas agência e debug. Vou pegar meu arquivo tempo, copiar, e vou colar indo no Bytebank sistema agência bin debug e vou colar aqui. Ao fazer isso minha aplicação vai achar o arquivo sem necessidade de colocar o caminho.

Já tenho o nome do arquivo. Preciso agora abrir o arquivo. Como abro o arquivo? Na verdade, mostrei no vídeo anterior, não posso abrir o arquivo todo. Tenho que abrir ele dentro de um fluxo, ler ele aos poucos. Para fazer isso vou usar um método que temos na classe, no visual basic.

Vou criar uma variável fluxo do arquivo as new, vem do inglês stream, só que é um stream de quê? De dll? De executável? Não, de um arquivo. Temos aqui o que chamamos de final stream, só que note que o visual basic não gostou muito. Ele está pedindo que eu adicione ou importe algum namespace. Se eu vier aqui e mostrar possíveis correções ele vai adicionar o imports system io.

Esse namespace externo é muito importante. É o responsável por manipulação de arquivo. Io vem de input output. Vou selecionar aqui. Ao fazer isso meu final stream já ficou com a cor diferente, mas ainda está errado, porque faltam parâmetros para colocar aqui. Quando eu abrir, note que tenho diversas informações a serem colocadas. A primeira é a localização do arquivo e o nome dele. Tenho isso no endereço do arquivo.

Outro parâmetro é o tipo de acesso. Vou abrir esse arquivo para escrever, ler, compactar, exibir? No caso para ler, vou ler informações. Então tenho o file mode open. Estou abrindo ele para poder ler. Recapitulando, final stream, nome do arquivo e modo que vou manipular esse arquivo. No caso vou ler.

Abri o arquivo. Preciso agora capturar conteúdo dele. Não vou ler o arquivo todo, tenho que ler uma parte desse arquivo, uma parte de número de bytes desse arquivo. Nosso arquivo tem 37kb. Vamos fazer o seguinte. Vamos pegar o fluxo do arquivo, vou dar um read. Vou ler um pedaço do arquivo.

O que passo para esse read? Preciso passar três informações. Um array de bytes que vai receber o número de bytes que estou lendo, o offset, que é a posição inicial de leitura, e o count, que é o tamanho da leitura. Se eu der offset zero estou lendo desde o início do arquivo.

Esse array de bytes preciso declarar antes. Normalmente a gente dá um nome padronizado para ele. Vou criar uma variável chamada buffer, vai ser um new bytes de tamanho 1.024, e coloco esse abre e fecha chaves para dizer que está sendo inicializado vazio.

Tenho esse buffer de tamanho 1.024 que representa um kb, tenho um array que vai receber 1.024, um kb de tamanho, e vai colocar cada posição desse array em um byte. No meu read vou passar o buffer, ou seja, ela vai entrar no meu read vazia e vai sair com o pedaço do arquivo que estou lendo. E vou ler da posição 0 até a posição 1.024. Ou seja, estou pegando o primeiro kb do meu arquivo, desde o início até a posição 1.024.

Vou escrever esses bytes, só que para escrever eles vou criar um método que vou chamar de escrever buffer, que claro, vou passar como parâmetro o buffer que é um array de bytes. Preciso percorrer esse meu array de bytes elemento a elemento e vou exibir o byte selecionado.

Vou fazer um for each, crio uma variável chamada meu byte, que é do tipo byte, e vou percorrer dentro do meu buffer. Posso escrever meu byte. Vou colocar um console write line meu byte. A gente usou pouco console write line, mas em cursos anteriores cheguei a mostrar isso. Ele vai escrever na minha saída, no meu io do programa quando estiver executando ele, para a gente poder ver o que vai acontecer aqui.

Visto que escrevi meu byte depois que leio aqui, vou executar o escrever buffer e passar como parâmetro buffer. Vamos salvar e executar. Vou clicar no botão 1, nada vai acontecer, mas se a gente vier na saída note que estou vendo uma lista de bytes. Byte 51, byte 55, byte 53.

O que é esse byte 51? O que significa isso? Se a gente olhar nosso arquivo texto, note que o primeiro elemento é o número 3. Se eu escrever 51, procurar na internet na tabela ascii, vamos ver a posição 51, é o número 3, que é o primeiro elemento 3. O segundo byte que ele escreveu é o 55, se eu olhar na tabela ascii 55 é o 7. Depois ele escreveu o 5, é o 53. Depois o 32, que é um espaço.

A gente consegue ver aqui os elementos da tabela ascii referentes aos bytes que estão no arquivo. Mas aqui nesse meu programa só li os primeiros 1.024 bytes, como faço para ler tudo até o final do arquivo e como sei que o arquivo acabou para parar a leitura? Vamos fazer isso no próximo vídeo.

Sobre o curso VB.NET com Windows Forms Parte 10: entrada e saída (I/O) com streams

O curso VB.NET com Windows Forms Parte 10: entrada e saída (I/O) com streams possui 193 minutos de vídeos, em um total de 50 atividades. Gostou? Conheça nossos outros cursos de .NET em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda .NET acessando integralmente esse e outros cursos, comece hoje!

Plus

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$85
à vista R$1.020
Matricule-se

Pro

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas