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


UnmanagedMemoryStream.Read Метод

Определение

Перегрузки

Read(Span<Byte>)

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

Read(Byte[], Int32, Int32)

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

Read(Span<Byte>)

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

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

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

Параметры

destinationbuffer
Span<Byte>

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

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

Общее количество байтов, считанных в место назначения.

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

Read(Byte[], Int32, Int32)

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

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

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

Параметры

buffer
Byte[]

Когда этот метод возвращает управление, он содержит указанный массив байтов, в котором значения между offset и (offset + count - 1) заменены байтами, считанными из текущего источника. Этот параметр передается неинициализированным.

offset
Int32

Смещение байтов (начиная с нуля) в buffer, с которого начинается сохранение данных, считанных из текущего потока.

count
Int32

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

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

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

Исключения

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

Основная память не поддерживает чтение.

-или-

Свойству CanRead задано значение false.

Значение параметра buffernull.

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

-или-

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

Длина массива буфера без учета параметра offset меньше значения параметра count.

Примеры

В следующем примере кода показано, как выполнять чтение и запись в неуправляемую память с помощью UnmanagedMemoryStream класса . Блок неуправляемой памяти выделяется и отменяется с помощью Marshal класса .


// 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();
    }
}

Комментарии

Параметр offset задает смещение байта в параметре array (индексе буфера), с которого начинается чтение, а count параметр — максимальное количество байтов, которые будут считываться из этого потока. Возвращаемое значение — это фактическое число прочитанных байтов или ноль, если достигнут конец потока. Если операция чтения выполнена успешно, текущая позиция потока будет расширена на количество прочитанных байтов. Если возникает исключение, текущая позиция потока не изменяется.

Метод Read возвращает ноль только после достижения конца потока. В противном Read случае всегда считывает по крайней мере один байт из потока перед возвратом. Если данные из потока не доступны при вызове Readметода , метод блокируется до тех пор, пока не будет возвращен хотя бы один байт данных. Реализация может возвращать меньше байтов, чем запрошено, даже если конец потока не достигнут.

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