UnmanagedMemoryStream.Read Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Overload
| Nome | Descrizione |
|---|---|
| Read(Span<Byte>) |
Legge tutti i byte di questo flusso di memoria non gestita nell'intervallo specificato di byte. |
| Read(Byte[], Int32, Int32) |
Legge il numero specificato di byte nella matrice specificata. |
Read(Span<Byte>)
Legge tutti i byte di questo flusso di memoria non gestita nell'intervallo specificato di byte.
public:
override int Read(Span<System::Byte> destination);
public override int Read(Span<byte> destination);
override this.Read : Span<byte> -> int
Public Overrides Function Read (destination As Span(Of Byte)) As Integer
Parametri
Quando termina, questo intervallo contiene tutti i byte del flusso di memoria non gestito.
Valori restituiti
Numero totale di byte letti nella destinazione.
Si applica a
Read(Byte[], Int32, Int32)
Legge il numero specificato di byte nella matrice specificata.
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
Parametri
- buffer
- Byte[]
Quando termina, questo metodo contiene la matrice di byte specificata con i valori compresi tra offset e (offset + count - 1) sostituiti dai byte letti dall'origine corrente. Questo parametro viene passato non inizializzato.
- offset
- Int32
Offset dei byte in base zero in in buffer corrispondenza del quale iniziare a archiviare i dati letti dal flusso corrente.
- count
- Int32
Numero massimo di byte da leggere dal flusso corrente.
Valori restituiti
Numero totale di byte letti nel buffer. Può essere minore del numero di byte richiesti se tale numero di byte non è attualmente disponibile oppure zero (0) se è stata raggiunta la fine del flusso.
Eccezioni
Il flusso è chiuso.
Il parametro buffer viene impostato su null.
Il offset parametro è minore di zero.
oppure
Il count parametro è minore di zero.
La lunghezza della matrice di buffer meno il offset parametro è minore del count parametro .
Esempio
Nell'esempio di codice seguente viene illustrato come leggere e scrivere in memoria non gestita usando la UnmanagedMemoryStream classe . Un blocco di memoria non gestita viene allocato e de-allocato usando la 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();
}
}
Commenti
Il offset parametro assegna l'offset del byte nel array parametro (indice del buffer) in corrispondenza del quale iniziare la lettura e il count parametro assegna il numero massimo di byte da leggere da questo flusso. Il valore restituito è il numero effettivo di byte letti o zero se viene raggiunta la fine del flusso. Se l'operazione di lettura ha esito positivo, la posizione corrente del flusso viene avanzata dal numero di byte letti. Se si verifica un'eccezione, la posizione corrente del flusso rimane invariata.
Il Read metodo restituisce zero solo dopo aver raggiunto la fine del flusso. In caso contrario, Read legge sempre almeno un byte dal flusso prima di restituire. Se non sono disponibili dati dal flusso in una chiamata a Read, il metodo bloccherà fino a quando non sarà possibile restituire almeno un byte di dati. Un'implementazione è libera di restituire meno byte di quanto richiesto anche se la fine del flusso non è stata raggiunta.