У меня есть требование написать HTML в файловой системе, и мне было интересно, есть ли ускорение в преобразовании его в байты и запись его с помощью FileStream, а не с использованием File.WriteAllText() (или аналогичного текстового метода).
File.WriteAllText использует StreamWriter за кадром:
public static void WriteAllText(string path, string contents, Encoding encoding)
{
using (StreamWriter writer = new StreamWriter(path, false, encoding))
{
writer.Write(contents);
}
}
У вас уже есть строка, поэтому преобразование ее в массив байтов было бы бессмысленным, потому что это выполняется внутри метода StreamWriter.Flush в любом случае используя свой базовый класс Encoder. Flush вызывается методом StreamWriter.Dispose, который вызывает предложение use. Это фрагмент из источника Flush через отражатель:
int count = this.encoder.GetBytes(this.charBuffer, 0, this.charPos, this.byteBuffer, 0, flushEncoder);
Вы можете видеть, что у него есть charBuffer. Это просто массив char [], который он пишет, когда вы выполняете StreamWriter.Write(строка).
Короче говоря, у вас уже есть строка, просто пусть более короткий метод File выполнит каскадные вызовы, так как ваш источник немного читается. Преобразование его в массив байтов также не требуется, поскольку я упоминал, что StreamWriter делает это за вас.
Если вы получаете проблемы с конверсией, используйте Encoding.Unicode как последний параметр в перегрузке параметра 3, так как File.WriteAllText(строка, строка) использует UTF8 без спецификации.
Как вы думаете, что происходит в File.WriteAllText? В конце концов, это будут байты, попадающие на диск. В любом случае, этот диск вряд ли будет медленной частью этой цепочки. Если данные, написанные, не очень велики, я бы не стал беспокоиться об этом, и просто использовать реализацию, которую я чувствовал, было наиболее удобным. Если вы хорошо спроектируете код, это не будет важно изменить позже, если это необходимо.
Сначала напишите код, который наиболее читабельен и обслуживается. Тогда в будущем, если у вас есть проблемы с производительностью, найдите шею бутылки.
(я был бы очень удивлен, если шея бутылки окажется чем-то связанным с преобразованием строки в массив байтов или нет). Шея бутылки с чем-то вроде этого будет вашей скоростью записи на диск)