1
resposta

O resultado aparece repetido

Boa Tarde,

Estou com uma dúvida sobre o resultado que aparece durante o carregamento da aplicação. A leitura do arquivo contas.txt aparece repetido no final da execução da aplicação.

Segue o código abaixo:


using ByteBankImportacaoExportacao.Modelos;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ByteBankImportacaoExportacao 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        {

            string arquivo = "contas.txt";

            var fluxoDoArquivo = new FileStream(arquivo, FileMode.Open);
            //criação de um buffer de 1KB de capacidade
            var buffer = new byte[1024];

            var quantidadeBytesLidos = -1;
            while (quantidadeBytesLidos != 0)
            {
                quantidadeBytesLidos = fluxoDoArquivo.Read(buffer, 0, 1024); 
                EscreverBuffer(buffer);

            }            
            Console.ReadLine();
        }

        static void EscreverBuffer(byte[] buffer)
        {
            var texto = Encoding.UTF8.GetString(buffer);
            Console.Write(texto);           
        }
    }
}
1 resposta

Olá, Rafael

Isso problema ocorre porque você está lendo o buffer completo de 1024 bytes a cada iteração do loop while, mesmo que a quantidade de bytes lidos seja menor do que isso. Então, quando você chama o método EscreverBuffer, ele exibe o conteúdo completo do buffer, incluindo os bytes não utilizados.

Uma solução para esse problema é modificar o método EscreverBuffer para exibir apenas a quantidade de bytes lidos. Você pode fazer isso passando a quantidade de bytes lidos como argumento para o método EscreverBuffer e ajustando o loop foreach para iterar apenas até a quantidade de bytes lidos. Aqui está uma possível implementação:

static void EscreverBuffer(byte[] buffer, int quantidadeBytesLidos)
{
    var texto = Encoding.UTF8.GetString(buffer, 0, quantidadeBytesLidos);
    Console.Write(texto);
}

Em seguida, você precisa modificar a chamada para o método EscreverBuffer no loop while, passando a quantidade de bytes lidos como argumento:

quantidadeBytesLidos = fluxoDoArquivo.Read(buffer, 0, 1024);
EscreverBuffer(buffer, quantidadeBytesLidos);

Dessa forma, apenas a quantidade correta de bytes lidos será exibida no console, sem repetições desnecessárias.

Espero ter ajudado e bons estudos!