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


GZipStream.Read Метод

Определение

Перегрузки

Read(Span<Byte>)

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

Read(Byte[], Int32, Int32)

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

Read(Span<Byte>)

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

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

public:
 override int Read(Span<System::Byte> buffer);
public override int Read (Span<byte> buffer);
override this.Read : Span<byte> -> int
Public Overrides Function Read (buffer As Span(Of Byte)) As Integer

Параметры

buffer
Span<Byte>

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

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

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

Комментарии

Важно!

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

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

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

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

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

Read(Byte[], Int32, Int32)

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

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

public:
 override int Read(cli::array <System::Byte> ^ array, int offset, int count);
public:
 override int Read(cli::array <System::Byte> ^ buffer, int offset, int count);
public override int Read (byte[] array, int offset, int count);
public override int Read (byte[] buffer, int offset, int count);
override this.Read : byte[] * int * int -> int
override this.Read : byte[] * int * int -> int
Public Overrides Function Read (array As Byte(), offset As Integer, count As Integer) As Integer
Public Overrides Function Read (buffer As Byte(), offset As Integer, count As Integer) As Integer

Параметры

arraybuffer
Byte[]

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

offset
Int32

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

count
Int32

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

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

Число байтов, которые были распакованы в массив байтов. Если достигнут конец потока, возвращаемое значение представляет собой число считанных байтов или же равно нулю.

Исключения

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

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

-или-

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

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

-или-

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

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

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

Примеры

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

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 282 bytes.
            The decompressed string length is 445 bytes, same as the original length.
        */
    }

    private static void CompressBytesToStream(Stream stream)
    {
        using var compressor = new GZipStream(stream, CompressionLevel.SmallestSize, 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 gzipStream = new GZipStream(stream, CompressionMode.Decompress);

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

        return totalRead;
    }
}
open System.IO
open System.IO.Compression
open System.Text

let 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."

let s_messageBytes = Encoding.ASCII.GetBytes message

let compressBytesToStream stream =
    use compressor =
        new GZipStream(stream, CompressionLevel.SmallestSize, leaveOpen = true)

    compressor.Write(s_messageBytes, 0, s_messageBytes.Length)

let decompressStreamToBytes (stream: Stream) =
    stream.Position <- 0
    let bufferSize = 512
    let decompressedBytes = Array.zeroCreate bufferSize
    use decompressor = new GZipStream(stream, CompressionMode.Decompress)
    decompressor.Read(decompressedBytes, 0, bufferSize)

[<EntryPoint>]
let main _ =
    printfn $"The original string length is {s_messageBytes.Length} bytes."
    use stream = new MemoryStream()
    compressBytesToStream stream
    printfn $"The compressed stream length is {stream.Length} bytes."
    let decompressedLength = decompressStreamToBytes stream
    printfn $"The decompressed string length is {decompressedLength} bytes, same as the original length."
    0

// Output:
//     The original string length is 445 bytes.
//     The compressed stream length is 282 bytes.
//     The decompressed string length is 445 bytes, same as the original length.
Imports System.IO
Imports System.IO.Compression
Imports System.Text

Module MemoryWriteReadExample
    Private Const Message As String = "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 ReadOnly s_messageBytes As Byte() = Encoding.ASCII.GetBytes(Message)

    Sub Main()
        Console.WriteLine($"The original string length is {s_messageBytes.Length} bytes.")

        Using stream = New MemoryStream()
            CompressBytesToStream(stream)
            Console.WriteLine($"The compressed stream length is {stream.Length} bytes.")
            Dim decompressedLength As Integer = DecompressStreamToBytes(stream)
            Console.WriteLine($"The decompressed string length is {decompressedLength} bytes, same as the original length.")
        End Using
        ' Output:
        '   The original string length is 445 bytes.
        '   The compressed stream length is 282 bytes.
        '   The decompressed string length is 445 bytes, same as the original length.
    End Sub

    Private Sub CompressBytesToStream(ByVal stream As Stream)
        Using compressor = New GZipStream(stream, CompressionLevel.SmallestSize, leaveOpen:=True)
            compressor.Write(s_messageBytes, 0, s_messageBytes.Length)
        End Using
    End Sub

    Private Function DecompressStreamToBytes(ByVal stream As Stream) As Integer
        stream.Position = 0
        Dim bufferSize As Integer = 512
        Dim decompressedBytes As Byte() = New Byte(bufferSize - 1) {}
        Using decompressor = New GZipStream(stream, CompressionMode.Decompress)
            Dim length As Integer = decompressor.Read(decompressedBytes, 0, bufferSize)
            Return length
        End Using
    End Function
End Module

Комментарии

Важно!

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

Если данные найдены в недопустимом формате, InvalidDataException возникает исключение . Циклическая проверка избыточности (CRC) выполняется в качестве одной из последних операций этого метода.

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