Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Não estou entendendo muito bem o uso do Buffer neste contexto

Boa noite a todos!

Durante o curso, fiquei com uma dúvida sobre o Buffer dentro do método Read. Ao que eu entendi, abrimos o arquivo com o FileStream, utilizamos o numeroDeBytesLidos para interromper o laço do while, que é retornado do Read, mas o buffer não está fazendo nada. Quando eu bato o olho no código pra mim ele permanece com uma instância de bytes na memória com 1024 índices, mas não é isso que acontece de fato, o buffer ele é preenchido e modificado sem ao menos colocar um ref buffer dentro do Read. Alguém sabe como isso é possível?

var buffer = new byte[1024]; 
while (numeroDeBytesLidos != 0)
{
    numeroDeBytesLidos = fluxoArquivo.Read(buffer, 0, 1024);
    EscreverBuffer(buffer);
}
1 resposta
solução!

Boa noite.

O tamanho do buffer permanecerá constante (1024 bytes). O que o Read faz é ir lendo o Stream e preenchendo esse buffer. Inicialmente ele começa como um array de 1024 bytes com todas as posições zeradas. E depois conforme vai sendo executado o método Read, ele vai sendo preenchido.

Imagine que seu stream possua esses bytes:

new byte[] { 66, 68, 81, 73 }

E você declare um buffer com tamanho de 2 bytes.

  • Ao declarar o buffer, ele será terá: [0, 0]
  • No primeiro Read do stream ele irá para: [66, 68]
  • No segundo Read do stream ele irá para? [81, 73]

Segue um exemplo:

using Stream fakeFile = new MemoryStream(new byte[] { 66, 68, 81, 73 });
byte[] buffer = new byte[2];
int readBytes;

while ((readBytes = fakeFile.Read(buffer)) != 0)
{
    Console.WriteLine(string.Join(" - ", buffer));
}

Sobre o "ref". Não é necessário. Todo array já é passado como referência.

*Arrays are always passed by reference to a method. Since the CLR doesn't support the notion of constant parameters, this means that the method is able to change the elements in the array *

Fonte: https://learn.microsoft.com/en-us/previous-versions/dotnet/articles/bb985948(v=msdn.10)?redirectedfrom=MSDN