Чтение из FileStream и StreamRaeder различий с кодировкой?

1

Из-за проблем с файлом, который я хочу прочитать (когда он был открыт словом, когда я попытался прочитать вариант File.Open, и мне пришлось использовать FileStream + StreamReader, чтобы избежать этой проблемы), мне пришлось переключиться с использования файла. Откройте и используйте полученный FileStream для чтения, чтобы

using (StreamReader sourceStream = 
         new StreamReader(
              new FileStream(filePath, FileMode.Open, 
                             FileAccess.Read, FileShare.ReadWrite), 
              Encoding.Default))

А затем с помощью получателя данных для чтения файла.

Теперь мне интересно: Поскольку я теперь читаю массив символов и использую Encoding (Encoding.Default), есть ли что-нибудь в отношении кодирования, которое теперь отличается от варианта, который у меня был раньше (до того, как я использовал File. Откройте, а затем прочитайте массив байтов из FileStream). Таким образом, я должен быть более осторожным в отношении кодирования, чем раньше?

Теги:
file-io
encoding

1 ответ

0
Лучший ответ

Почему вы хотите использовать StreamReader? Он предназначен для чтения символов, а не байтов, поэтому для этого требуется параметр кодирования. Вы можете просто читать непосредственно из FileStream с помощью методов FileStream.Read или FileStream.ReadByte.

UPD:

Статический метод File.Open имеет те же параметры, что и конструктор FileStream. Значит, вы не можете просто передать те же параметры этому методу?

public static FileStream Open(
    string path,
    FileMode mode,
    FileAccess access,
    FileShare share
)

UPD2:

Вы можете прочитать следующее консольное приложение, чтобы увидеть различия. Просто измените filePath на любой текстовый файл с кодировкой UTF8.

using System;
using System.Text;
using System.IO;

namespace FileReadTest
{
    class Program
    {
        private static void Main(string[] args)
        {
            string fileName = "d:\\utf.txt";

            Console.WriteLine("Reding using File.Open");
            using (var stream = File.Open(fileName, FileMode.Open, FileAccess.Read))
            {
                int oneByte = stream.ReadByte();
                while (oneByte != -1)
                {
                    Console.WriteLine(oneByte);
                    oneByte = stream.ReadByte();
                }
            };

            Console.WriteLine("Reading using StreamReader");
            using (
                StreamReader sourceStream =
                    new StreamReader(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite),
                        Encoding.Default))
            {
                int oneChar = sourceStream.Read();
                while (oneChar != -1)
                {
                    Console.WriteLine(oneChar);
                    oneChar = sourceStream.Read();
                }
            }
        }
    }
}

Я использовал файл, содержащий "123abc", и он содержит некоторые маркерные байты в начале кодировки UTF8. Выход будет еще более очевидным, если вы поместите в этот файл определенные символы, такие как русский или китайский.

  • 0
    хорошая точка зрения. только что попробовал и увидел, что он все еще работает с FileStream, который используется напрямую (не знаю, почему он провалился в моем первом тесте, возможно, там была ошибка записи). Хотя оригинальный вопрос все равно будет интересен мне, если результат будет разным для тех же файлов.
  • 0
    Один символ может состоять из более чем одного байта в зависимости от кодировки. Таким образом, если вы читаете массив символов (первый случай), вы можете получить результат, который отличается от чтения байтового массива. Вопрос в том, как преобразовать полученный символ в байты и сохранить его в массиве.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню