Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Encoding do Array de Bytes - Exercício Aula 3 (I/O)

Testando o código do exercício 3 (ajustando o rodapé para dentro do Using do FileStream) em minha máquina, a cópia foi realizada com sucesso:

var arquivoOriginal = new FileStream("c:/temp/teste.txt", FileMode.Open);
var arquivoNovo = new FileStream("c:/temp/teste_copia.txt", FileMode.Create);
var buffer = new byte[1024];

using (arquivoOriginal)
using (arquivoNovo)
{
    var bytesLidos = -1;
    while (bytesLidos != 0)
    {
        bytesLidos = arquivoOriginal.Read(buffer, 0, 1024);
        arquivoNovo.Write(buffer, 0, bytesLidos);
    }

    var rodape = Encoding.UTF8.GetBytes("Este documento é uma cópia do original");
    arquivoNovo.Write(rodape, 0, rodape.Length);
}

Minha dúvida é na questão do Encoding: No momento de escrever no arquivo "c:/temp/teste_copia.txt" não foi utilizado o método GetString da classe Enconding para converter a variável bytesLidos antes de invocar o método Write do arquivoNovo.

Por que o resultado não foi '????' ou uma cadeia de bytes da tabela ASCII? Tem algo a ver com fato do arquivoOriginal(Source) já possuir essa formatação Unicode, sendo assim ele simplesmente não precisa fazer isso antes da saída para o arquivoNovo(Target)?

3 respostas
solução!

Olá Matheus, tudo bem?

Não sei se entendi direito dua dúvida, mas primeiro foi feito a leitura byte a byte e logo em seguida a escrita desses bytes, que por não ter nenhum indicativo de qual Encoding deveria ser usado para esta escrita, o .Net acaba utilizando o padrão do sistema, que no nosso caso é o UTF-8.

Mesmo salvando o arquivo .txt em ANSI, o arquivo novo é criado em UTF-8. Depois fiz um teste alterando qual seria o tipo do encoding da segunda frase:

var rodape = Encoding.ASCII.GetBytes("Este documento é uma cópia do original");
arquivoNovo.Write(rodape, 0, rodape.Length);

O resultado foi o seguinte:

Apareceram as interrogações, porque este trecho foi encodado para ASCII, mas o restante continua como UTF-8, inclusive o arquivo, que inicialmente era ANSI.

Espero ter ajudado!

Obrigado pela resposta Fabiano,

Pelo que compreendi, ele sempre usa o padrão do sistema então para Streams de Output.

Se precisarmos exibir na tela, por exemplo, ou armazenar em uma variável de string, aí sim teríamos que converter com o GetString, após ler por um Stream de input, certo?

O GetString() decodifica uma sequência de bytes em uma cadeia de caracteres.

Esse método pega os bytes e transforma em string. Seria mais o caso do texto já estar em bytes.

Mais informações neste link da documentação.