Если вы сжимаете некоторый текст json и записываете его в файл с помощью FileStream
, я получаю ожидаемые результаты. Однако я не хочу писать на диск. Я просто хочу запоминать сжатые данные.GZipStream работает при записи в FileStream, но не в MemoryStream
сжатия для FileStream
:
string json = Resource1.json;
using (MemoryStream input = new MemoryStream(Encoding.UTF8.GetBytes(json)))
using (FileStream output = File.Create(@"C:\Users\roarker\Desktop\output.json.gz"))
{
using (GZipStream compression = new GZipStream(output, CompressionMode.Compress))
{
input.CopyTo(compression);
}
}
Над работ. Ниже поток выходной памяти имеет длину 10 и в результате получается пустой .gz-файл.
string json = Resource1.json;
using (MemoryStream input = new MemoryStream(Encoding.UTF8.GetBytes(json)))
using (MemoryStream output = new MemoryStream())
{
using (GZipStream compression = new GZipStream(output, CompressionMode.Compress))
{
input.CopyTo(compression);
byte[] bytes = output.ToArray();
}
}
EDIT: Перемещение output.ToArray()
за пределами внутреннего using
пункта, кажется, работает. Тем не менее, это закрывает выходной поток для большей части использования. IE:
using (MemoryStream input = new MemoryStream(Encoding.UTF8.GetBytes(json)))
using (MemoryStream output = new MemoryStream())
{
using (GZipStream compression = new GZipStream(output, CompressionMode.Compress))
{
input.CopyTo(compression);
}
WriteToFile(output);
}
где:
public static void WriteToFile(Stream stream)
{
using (FileStream output = File.Create(@"C:\Users\roarker\Desktop\output.json.gz"))
{
stream.CopyTo(output);
}
}
Это потерпит неудачу на stream.CopyTo, потому что поток был закрыт. Я знаю, что могу сделать новый Stream
из байтов output.ToArray()
, но почему это необходимо? почему ToArray()
работают, когда поток закрыт?
Final Edit:
Просто необходимо использовать застройщик в GZipStream
с параметром leaveOpen
.
Чтобы быть понятным, 'bytes.Length == 10' в конце. – Dave
Получаете ли вы такое же поведение, если вы переместите 'byte [] bytes = output.ToArray();' вне внутреннего 'using' блока? – GalacticCowboy
Потоки похожи на туалеты. Вы не закончили с ними, пока не покраснели. Если вы не какое-то отвратительное животное. Я имею в виду, действительно. – Will