Прочитать на английском

Поделиться через


DeflateStream.Read Метод

Определение

Перегрузки

Read(Span<Byte>)

Считывает последовательность байтов из текущего потока Deflate в диапазон байтов и перемещает позицию внутри потока Deflate на число считанных байтов.

Read(Byte[], Int32, Int32)

Считывает число распакованных байтов в указанный массив байтов.

Read(Span<Byte>)

Исходный код:
DeflateStream.cs
Исходный код:
DeflateStream.cs
Исходный код:
DeflateStream.cs

Считывает последовательность байтов из текущего потока Deflate в диапазон байтов и перемещает позицию внутри потока Deflate на число считанных байтов.

C#
public override int Read (Span<byte> buffer);

Параметры

buffer
Span<Byte>

Область памяти. При возвращении данного метода содержимое этой области заменяется байтами, считанными из текущего источника.

Возвращаемое значение

Общее количество байтов, считанных в буфер. Это число может быть меньше количества выделенных в буфере байтов, если столько байтов в настоящее время недоступно, а также равняться нулю (0), если был достигнут конец потока.

Комментарии

Важно!

Начиная с .NET 6 этот метод может считывать не столько байтов, сколько было запрошено. Дополнительные сведения см. в разделе Частичные и нулевые операции чтения в DeflateStream, GZipStream и CryptoStream.

Используйте свойство , CanRead чтобы определить, поддерживает ли текущий экземпляр чтение. Используйте метод для ReadAsync асинхронного чтения из текущего потока.

Этот метод считывает максимум buffer.Length байтов из текущего потока и сохраняет их в buffer. Текущая позиция в потоке Deflate расширяется на количество прочитанных байтов; Однако если возникает исключение, текущая позиция в потоке Deflate остается неизменной. Этот метод блокируется до тех пор, пока не будет прочитан хотя бы один байт данных, если данные недоступны. Read возвращает значение 0, только если в потоке больше нет данных и больше не ожидается (например, закрытый сокет или конец файла). Метод может возвращать меньше байтов, чем запрошено, даже если не достигнут конец потока.

Используется BinaryReader для чтения примитивных типов данных.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Standard 2.1

Read(Byte[], Int32, Int32)

Исходный код:
DeflateStream.cs
Исходный код:
DeflateStream.cs
Исходный код:
DeflateStream.cs

Считывает число распакованных байтов в указанный массив байтов.

C#
public override int Read (byte[] array, int offset, int count);
C#
public override int Read (byte[] buffer, int offset, int count);

Параметры

arraybuffer
Byte[]

Массив для хранения распакованных байтов.

offset
Int32

Смещение байтов, с которым будут помещены прочитанные байты.

count
Int32

Максимальное число распакованных байтов для считывания.

Возвращаемое значение

Число байтов, которые были считаны в массив байтов.

Исключения

Параметр array или buffer имеет значение null.

При создании объекта значение CompressionMode было равно Compress.

-или-

Основной поток не поддерживает чтение.

Значение параметра offset или count меньше нуля.

-или-

array или buffer длина за вычетом начальной точки индекса меньше count.

Недопустимый формат данных.

Поток закрыт.

Комментарии

Важно!

Начиная с .NET 6 этот метод может считывать не столько байтов, сколько было запрошено. Дополнительные сведения см. в разделе Частичные и нулевые операции чтения в DeflateStream, GZipStream и CryptoStream.

В следующем примере показано, как сжимать и распаковывать Read байты с помощью методов и Write .

C#
using System;
using System.IO;
using System.IO.Compression;
using System.Text;

public static class MemoryWriteReadExample
{
    private const string Message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
    private static readonly byte[] s_messageBytes = Encoding.ASCII.GetBytes(Message);

    public static void Run()
    {
        Console.WriteLine($"The original string length is {s_messageBytes.Length} bytes.");
        using var stream = new MemoryStream();
        CompressBytesToStream(stream);
        Console.WriteLine($"The compressed stream length is {stream.Length} bytes.");
        int decompressedLength = DecompressStreamToBytes(stream);
        Console.WriteLine($"The decompressed string length is {decompressedLength} bytes, same as the original length.");
        /*
         Output:
            The original string length is 445 bytes.
            The compressed stream length is 265 bytes.
            The decompressed string length is 445 bytes, same as the original length.
        */
    }

    private static void CompressBytesToStream(Stream stream)
    {
        using var compressor = new DeflateStream(stream, CompressionMode.Compress, leaveOpen: true);
        compressor.Write(s_messageBytes, 0, s_messageBytes.Length);
    }

    private static int DecompressStreamToBytes(Stream stream)
    {
        stream.Position = 0;
        int bufferSize = 512;
        byte[] buffer = new byte[bufferSize];
        using var deflateStream = new DeflateStream(stream, CompressionMode.Decompress);

        int totalRead = 0;
        while (totalRead < buffer.Length)
        {
            int bytesRead = deflateStream.Read(buffer.AsSpan(totalRead));
            if (bytesRead == 0) break;
            totalRead += bytesRead;
        }

        return totalRead;
    }
}

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0