UnmanagedMemoryStream.Read Método

Definição

Sobrecargas

Read(Span<Byte>)

Lê todos os bytes desse fluxo de memória não gerenciado no intervalo especificado de bytes.

Read(Byte[], Int32, Int32)

Lê o número de bytes especificado na matriz especificada.

Read(Span<Byte>)

Origem:
UnmanagedMemoryStream.cs
Origem:
UnmanagedMemoryStream.cs
Origem:
UnmanagedMemoryStream.cs

Lê todos os bytes desse fluxo de memória não gerenciado no intervalo especificado de bytes.

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

Parâmetros

destinationbuffer
Span<Byte>

Quando esse método é retornado, esse intervalo contém todos os bytes do fluxo de memória não gerenciado.

Retornos

O número total de bytes lidos no destino.

Aplica-se a

.NET 9 e outras versões
Produto Versões
.NET Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Standard 2.1

Read(Byte[], Int32, Int32)

Origem:
UnmanagedMemoryStream.cs
Origem:
UnmanagedMemoryStream.cs
Origem:
UnmanagedMemoryStream.cs

Lê o número de bytes especificado na matriz especificada.

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

Parâmetros

buffer
Byte[]

Quando este método retorna, ele contém a matriz de bytes especificada com os valores entre offset e (offset + count -1) substituídos pelos bytes lidos da fonte atual. Este parâmetro é passado não inicializado.

offset
Int32

O deslocamento de bytes baseado em zero em buffer no qual será iniciada a leitura de dados no fluxo atual.

count
Int32

O número máximo de bytes a serem lidos do fluxo atual.

Retornos

O número total de bytes lidos do buffer. Isso poderá ser menor que o número de bytes solicitado se esses muitos bytes não estiverem disponíveis no momento, ou zero (0) se o final do fluxo tiver sido atingido.

Exceções

O fluxo está fechado.

A memória subjacente não dá suporte a leitura.

- ou -

A propriedade CanRead é definida como false.

O parâmetro buffer é definido como null.

O parâmetro offset é menor que zero.

- ou -

O parâmetro count é menor que zero.

O comprimento da matriz de buffer menos o parâmetro offset é menor do que o parâmetro count.

Exemplos

O exemplo de código a seguir demonstra como ler e gravar na memória não gerenciada usando a UnmanagedMemoryStream classe . Um bloco de memória não gerenciada é alocado e desalocado usando a Marshal classe .


// Note: you must compile this sample using the unsafe flag.
// From the command line, type the following: csc sample.cs /unsafe

using System;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;

unsafe class TestWriter
{
    static void Main()
    {
        // Create some data to read and write.
        byte[] message = UnicodeEncoding.Unicode.GetBytes("Here is some data.");

        // Allocate a block of unmanaged memory and return an IntPtr object.	
        IntPtr memIntPtr = Marshal.AllocHGlobal(message.Length);

        // Get a byte pointer from the IntPtr object.
        byte* memBytePtr = (byte*)memIntPtr.ToPointer();

        // Create an UnmanagedMemoryStream object using a pointer to unmanaged memory.
        UnmanagedMemoryStream writeStream = new UnmanagedMemoryStream(memBytePtr, message.Length, message.Length, FileAccess.Write);

        // Write the data.
        writeStream.Write(message, 0, message.Length);

        // Close the stream.
        writeStream.Close();

        // Create another UnmanagedMemoryStream object using a pointer to unmanaged memory.
        UnmanagedMemoryStream readStream = new UnmanagedMemoryStream(memBytePtr, message.Length, message.Length, FileAccess.Read);

        // Create a byte array to hold data from unmanaged memory.
        byte[] outMessage = new byte[message.Length];

        // Read from unmanaged memory to the byte array.
        readStream.Read(outMessage, 0, message.Length);

        // Close the stream.
        readStream.Close();

        // Display the data to the console.
        Console.WriteLine(UnicodeEncoding.Unicode.GetString(outMessage));

        // Free the block of unmanaged memory.
        Marshal.FreeHGlobal(memIntPtr);

        Console.ReadLine();
    }
}

Comentários

O offset parâmetro fornece o deslocamento do byte no array parâmetro (o índice de buffer) no qual começar a ler e o count parâmetro fornece o número máximo de bytes a serem lidos desse fluxo. O valor retornado será o número real de bytes lidos ou zero se o final do fluxo for atingido. Se a operação de leitura for bem-sucedida, a posição atual do fluxo será avançada pelo número de bytes lidos. Se ocorrer uma exceção, a posição atual do fluxo permanecerá inalterada.

O Read método retorna zero somente depois de chegar ao final do fluxo. Caso contrário, Read sempre lê pelo menos um byte do fluxo antes de retornar. Se nenhum dado estiver disponível no fluxo após uma chamada para Read, o método será bloqueado até que pelo menos um byte de dados possa ser retornado. Uma implementação é livre para retornar menos bytes do que o solicitado, mesmo que o final do fluxo não tenha sido atingido.

Aplica-se a

.NET 9 e outras versões
Produto Versões
.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 2.0, 2.1
UWP 10.0