No '\ 0' не добавляется StreamWriter.Это просто содержимое отображенного в память файла, вещи, которые были там до , когда вы начали писать.StreamReader нужен индикатор конца файла, чтобы знать, когда прекратить чтение.В ММФ нет ничего, кроме размера раздела.Как и второй аргумент, который вы передаете MemoryMappedFile.CreateNew (string, long).
Или, другими словами, вы создали mmf, который слишком велик, чтобы соответствовать потоку.Ну, конечно, у вас не было машины времени, чтобы угадать, насколько большой она будет.Вам определенно нужно что-то с этим делать, обрезка нулей недостаточно хороша.Это не так во второй раз, когда вы пишете поток, который короче.Читатель теперь будет по-прежнему видеть байты из предыдущего содержимого потока, и они не будут равны нулю.
В противном случае это обычная головная боль с mmfs, они просто куски памяти, а поток - очень плохая абстракциятого, что.Одна из главных причин того, что mmfs так долго поддерживали .NET, хотя они и являются основной функцией ОС.Вам нужны указатели для отображения mmf, и это не очень хорошо поддерживается на управляемом языке.
Я не вижу хорошего способа научить StreamReader новым приемам в этом случае.Копирование байтов из MMF в MemoryStream решило бы проблему, но скорее победило бы точку MMF.
Попробуйте вместо этого использовать трубу.