Freigeben über


Stream Klasse

Definition

Stellt eine generische Ansicht einer Bytesequenz bereit. Dies ist eine abstrakte Klasse.

public ref class Stream abstract : IDisposable
public ref class Stream abstract : MarshalByRefObject, IAsyncDisposable, IDisposable
public ref class Stream abstract : MarshalByRefObject, IDisposable
public abstract class Stream : IDisposable
public abstract class Stream : MarshalByRefObject, IAsyncDisposable, IDisposable
public abstract class Stream : MarshalByRefObject, IDisposable
[System.Serializable]
public abstract class Stream : MarshalByRefObject, IDisposable
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class Stream : MarshalByRefObject, IDisposable
type Stream = class
    interface IDisposable
type Stream = class
    inherit MarshalByRefObject
    interface IAsyncDisposable
    interface IDisposable
type Stream = class
    inherit MarshalByRefObject
    interface IDisposable
[<System.Serializable>]
type Stream = class
    inherit MarshalByRefObject
    interface IDisposable
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Stream = class
    inherit MarshalByRefObject
    interface IDisposable
Public MustInherit Class Stream
Implements IDisposable
Public MustInherit Class Stream
Inherits MarshalByRefObject
Implements IAsyncDisposable, IDisposable
Public MustInherit Class Stream
Inherits MarshalByRefObject
Implements IDisposable
Vererbung
Stream
Vererbung
Abgeleitet
Attribute
Implementiert

Beispiele

Im folgenden Beispiel wird veranschaulicht, wie Zwei FileStream Objekte verwendet werden, um die Dateien asynchron aus einem Verzeichnis in ein anderes Verzeichnis zu kopieren. Die FileStream Klasse wird von der Stream Klasse abgeleitet. Beachten Sie, dass der Click Ereignishandler für das Button-Steuerelement mit dem async Modifizierer gekennzeichnet ist, da er eine asynchrone Methode aufruft.

using System;
using System.Threading.Tasks;
using System.Windows;
using System.IO;

namespace WpfApplication
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            string StartDirectory = @"c:\Users\exampleuser\start";
            string EndDirectory = @"c:\Users\exampleuser\end";

            foreach (string filename in Directory.EnumerateFiles(StartDirectory))
            {
                using (FileStream SourceStream = File.Open(filename, FileMode.Open))
                {
                    using (FileStream DestinationStream = File.Create(EndDirectory + filename.Substring(filename.LastIndexOf('\\'))))
                    {
                        await SourceStream.CopyToAsync(DestinationStream);
                    }
                }
            }
        }
    }
}
Imports System.IO

Class MainWindow

    Private Async Sub Button_Click(sender As Object, e As RoutedEventArgs)
        Dim StartDirectory As String = "c:\Users\exampleuser\start"
        Dim EndDirectory As String = "c:\Users\exampleuser\end"

        For Each filename As String In Directory.EnumerateFiles(StartDirectory)
            Using SourceStream As FileStream = File.Open(filename, FileMode.Open)
                Using DestinationStream As FileStream = File.Create(EndDirectory + filename.Substring(filename.LastIndexOf("\"c)))
                    Await SourceStream.CopyToAsync(DestinationStream)
                End Using

            End Using
        Next
    End Sub

End Class

Hinweise

Stream ist die abstrakte Basisklasse aller Datenströme. Ein Datenstrom ist eine Abstraktion einer Bytesequenz, z. B. einer Datei, eines Eingabe-/Ausgabegeräts, einer prozessübergreifenden Kommunikationspipeline oder eines TCP/IP-Sockets. Die Stream Klasse und die abgeleiteten Klassen bieten eine allgemeine Ansicht dieser verschiedenen Eingabe- und Ausgabetypen und isolieren den Programmierer anhand der spezifischen Details des Betriebssystems und der zugrunde liegenden Geräte.

Datenströme umfassen drei grundlegende Vorgänge:

  • Sie können aus Datenströmen lesen. Das Lesen ist die Übertragung von Daten aus einem Datenstrom in eine Datenstruktur, z. B. ein Bytearray.

  • Sie können in Datenströme schreiben. Das Schreiben ist die Übertragung von Daten aus einer Datenstruktur in einen Datenstrom.

  • Streams können die Suche unterstützen. Suche bezieht sich auf Abfragen und Ändern der aktuellen Position innerhalb eines Datenstroms. Die Suchfunktion hängt von der Art des Sicherungsspeichers ab, über den ein Datenstrom verfügt. Beispielsweise haben Netzwerkdatenströme kein einheitliches Konzept einer aktuellen Position und unterstützen daher in der Regel keine Suche.

Einige der häufiger verwendeten Datenströme, die von Stream erben, sind FileStreamund MemoryStream.

Je nach zugrunde liegender Datenquelle oder Repository unterstützen Datenströme möglicherweise nur einige dieser Funktionen. Sie können einen Datenstrom nach seinen Funktionen abfragen, indem Sie die Eigenschaften CanRead, CanWriteund CanSeek der Stream Klasse verwenden.

Die methoden Read und Write lesen und schreiben Daten in einer Vielzahl von Formaten. Verwenden Sie für Datenströme, die die Suche unterstützen, die Methoden Seek und SetLength sowie die eigenschaften Position und Length, um die aktuelle Position und Länge eines Datenstroms abzufragen und zu ändern.

Dieser Typ implementiert die IDisposable Schnittstelle. Wenn Sie die Verwendung des Typs abgeschlossen haben, sollten Sie ihn entweder direkt oder indirekt verwerfen. Rufen Sie zum direkten Löschen des Typs die Dispose-Methode in einem try/catch-Block auf. Verwenden Sie zum indirekten Löschen ein Sprachkonstrukt wie using (in C#) oder Using (in Visual Basic). Weitere Informationen finden Sie im Abschnitt "Verwenden eines Objekts, das IDisposable implementiert", im Thema zur IDisposable Schnittstelle.

Durch das Löschen eines Stream Objekts werden alle gepufferten Daten geleert, und im Wesentlichen wird die Flush Methode für Sie aufgerufen. Dispose gibt auch Betriebssystemressourcen wie Dateihandles, Netzwerkverbindungen oder Arbeitsspeicher frei, die für interne Pufferung verwendet werden. Die BufferedStream-Klasse bietet die Möglichkeit, einen gepufferten Datenstrom um einen anderen Datenstrom umzuschließen, um die Lese- und Schreibleistung zu verbessern.

Ab .NET Framework 4.5 enthält die Stream-Klasse asynchrone Methoden, um asynchrone Vorgänge zu vereinfachen. Eine asynchrone Methode enthält Async in ihrem Namen, z. B. ReadAsync, WriteAsync, CopyToAsyncund FlushAsync. Mit diesen Methoden können Sie ressourcenintensive E/A-Vorgänge ausführen, ohne den Hauptthread zu blockieren. Diese Leistungsüberlegung ist in einer Windows 8.x Store-App oder Desktop-App besonders wichtig, bei der ein zeitaufwendiger Streamvorgang den UI-Thread blockieren und ihre App so erscheinen lässt, als ob sie nicht funktioniert. Die asynchronen Methoden werden in Verbindung mit den schlüsselwörtern async und await in Visual Basic und C# verwendet.

Bei Verwendung in einer Windows 8.x Store-App umfasst Stream zwei Erweiterungsmethoden: AsInputStream und AsOutputStream. Diese Methoden konvertieren ein Stream-Objekt in einen Datenstrom in der Windows-Runtime. Sie können einen Datenstrom in der Windows-Runtime auch mithilfe der methoden AsStreamForRead und AsStreamForWrite in ein Stream-Objekt konvertieren. Weitere Informationen finden Sie unter How to: Convert Between .NET Framework Streams and Windows Runtime Streams

Einige Streamimplementierungen führen lokale Pufferung der zugrunde liegenden Daten durch, um die Leistung zu verbessern. Für solche Datenströme können Sie die Flush- oder FlushAsync-Methode verwenden, um alle internen Puffer zu löschen und sicherzustellen, dass alle Daten in die zugrunde liegende Datenquelle oder das zugrunde liegende Repository geschrieben wurden.

Wenn Sie einen Datenstrom ohne Sicherungsspeicher (auch als Bit-Bucket bezeichnet) benötigen, verwenden Sie das feld Null, um eine Instanz eines Datenstroms abzurufen, der für diesen Zweck entwickelt wurde.

Hinweise für Ausführende

Wenn Sie eine abgeleitete Klasse von Streamimplementieren, müssen Sie Implementierungen für die methoden Read(Byte[], Int32, Int32) und Write(Byte[], Int32, Int32) bereitstellen. Die asynchronen Methoden ReadAsync(Byte[], Int32, Int32), WriteAsync(Byte[], Int32, Int32)und CopyToAsync(Stream) verwenden die synchronen Methoden Read(Byte[], Int32, Int32) und Write(Byte[], Int32, Int32) in ihren Implementierungen. Daher funktionieren Ihre Implementierungen von Read(Byte[], Int32, Int32) und Write(Byte[], Int32, Int32) ordnungsgemäß mit den asynchronen Methoden. Die Standardimplementierungen von ReadByte() und WriteByte(Byte) ein neues Bytearray mit einem einzelnen Element erstellen und dann Ihre Implementierungen von Read(Byte[], Int32, Int32) und Write(Byte[], Int32, Int32)aufrufen. Wenn Sie von Streamabgeleitet werden, empfiehlt es sich, diese Methoden außer Kraft zu setzen, um auf ihren internen Puffer zuzugreifen, falls vorhanden, um eine wesentlich bessere Leistung zu erzielen. Sie müssen auch Implementierungen von CanRead, CanSeek, CanWrite, Flush(), Length, Position, Seek(Int64, SeekOrigin)und SetLength(Int64).

Setzen Sie stattdessen nicht die Close()-Methode außer Kraft, fügen Sie stattdessen alle Stream Bereinigungslogik in die Dispose(Boolean)-Methode ein. Weitere Informationen finden Sie unter Implementieren einer Dispose-Methode.

Konstruktoren

Stream()

Initialisiert eine neue Instanz der Stream Klasse.

Felder

Null

Eine Stream ohne Sicherungsspeicher.

Eigenschaften

CanRead

Beim Überschreiben in einer abgeleiteten Klasse wird ein Wert abgerufen, der angibt, ob der aktuelle Datenstrom das Lesen unterstützt.

CanSeek

Wenn eine abgeleitete Klasse überschrieben wird, wird ein Wert abgerufen, der angibt, ob der aktuelle Datenstrom die Suche unterstützt.

CanTimeout

Ruft einen Wert ab, der bestimmt, ob der aktuelle Datenstrom Timeout ausführen kann.

CanWrite

Beim Überschreiben in einer abgeleiteten Klasse wird ein Wert abgerufen, der angibt, ob der aktuelle Datenstrom das Schreiben unterstützt.

Length

Wenn sie in einer abgeleiteten Klasse überschrieben wird, ruft die Länge in Bytes des Datenstroms ab.

Position

Wenn sie in einer abgeleiteten Klasse außer Kraft gesetzt wird, ruft die Position innerhalb des aktuellen Datenstroms ab oder legt sie fest.

ReadTimeout

Dient zum Abrufen oder Festlegen eines Werts in Millisekunden, der bestimmt, wie lange der Datenstrom vor dem Timeout zu lesen versucht.

WriteTimeout

Dient zum Abrufen oder Festlegen eines Werts in Millisekunden, der bestimmt, wie lange der Datenstrom versucht, vor dem Timeout zu schreiben.

Methoden

BeginRead(Byte[], Int32, Int32, AsyncCallback, Object)

Startet einen asynchronen Lesevorgang. (Verwenden Sie stattdessen ReadAsync(Byte[], Int32, Int32).)

BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object)

Startet einen asynchronen Schreibvorgang. (Verwenden Sie stattdessen WriteAsync(Byte[], Int32, Int32).)

Close()

Schließt den aktuellen Datenstrom und gibt alle Ressourcen (z. B. Sockets und Dateihandles) frei, die dem aktuellen Datenstrom zugeordnet sind. Anstatt diese Methode aufzurufen, stellen Sie sicher, dass der Datenstrom ordnungsgemäß verworfen ist.

CopyTo(Stream)

Liest die Bytes aus dem aktuellen Datenstrom und schreibt sie in einen anderen Datenstrom. Beide Datenströme werden um die Anzahl der kopierten Bytes erweitert.

CopyTo(Stream, Int32)

Liest die Bytes aus dem aktuellen Datenstrom und schreibt sie mithilfe einer angegebenen Puffergröße in einen anderen Datenstrom. Beide Datenströme werden um die Anzahl der kopierten Bytes erweitert.

CopyToAsync(Stream)

Liest die Bytes asynchron aus dem aktuellen Datenstrom und schreibt sie in einen anderen Datenstrom. Beide Datenströme werden um die Anzahl der kopierten Bytes erweitert.

CopyToAsync(Stream, CancellationToken)

Liest die Bytes asynchron aus dem aktuellen Datenstrom und schreibt sie mithilfe eines angegebenen Abbruchtokens in einen anderen Datenstrom. Beide Datenströme werden um die Anzahl der kopierten Bytes erweitert.

CopyToAsync(Stream, Int32)

Liest die Bytes asynchron aus dem aktuellen Datenstrom und schreibt sie mithilfe einer angegebenen Puffergröße in einen anderen Datenstrom. Beide Datenströme werden um die Anzahl der kopierten Bytes erweitert.

CopyToAsync(Stream, Int32, CancellationToken)

Liest asynchron die Bytes aus dem aktuellen Datenstrom und schreibt sie in einen anderen Datenstrom, wobei eine angegebene Puffergröße und ein Abbruchtoken verwendet wird. Beide Datenströme werden um die Anzahl der kopierten Bytes erweitert.

CreateObjRef(Type)

Erstellt ein Objekt, das alle relevanten Informationen enthält, die zum Generieren eines Proxys erforderlich sind, der für die Kommunikation mit einem Remoteobjekt verwendet wird.

(Geerbt von MarshalByRefObject)
CreateWaitHandle()
Veraltet.
Veraltet.
Veraltet.

Weist ein WaitHandle-Objekt zu.

Dispose()

Gibt alle vom Streamverwendeten Ressourcen frei.

Dispose(Boolean)

Gibt die nicht verwalteten Ressourcen frei, die vom Stream verwendet werden, und gibt optional die verwalteten Ressourcen frei.

DisposeAsync()

Gibt asynchron die nicht verwalteten Ressourcen frei, die vom Streamverwendet werden.

EndRead(IAsyncResult)

Wartet auf den Abschluss des ausstehenden asynchronen Lesevorgangs. (Verwenden Sie stattdessen ReadAsync(Byte[], Int32, Int32).)

EndWrite(IAsyncResult)

Beendet einen asynchronen Schreibvorgang. (Verwenden Sie stattdessen WriteAsync(Byte[], Int32, Int32).)

Equals(Object)

Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht.

(Geerbt von Object)
Flush()

Wenn sie in einer abgeleiteten Klasse überschrieben werden, werden alle Puffer für diesen Datenstrom gelöscht und alle gepufferten Daten auf das zugrunde liegende Gerät geschrieben.

FlushAsync()

Löscht asynchron alle Puffer für diesen Datenstrom und bewirkt, dass alle gepufferten Daten auf das zugrunde liegende Gerät geschrieben werden.

FlushAsync(CancellationToken)

Löscht asynchron alle Puffer für diesen Datenstrom, bewirkt, dass alle gepufferten Daten auf das zugrunde liegende Gerät geschrieben werden, und überwacht Abbruchanforderungen.

GetHashCode()

Dient als Standardhashfunktion.

(Geerbt von Object)
GetLifetimeService()
Veraltet.

Ruft das aktuelle Lebensdauerdienstobjekt ab, das die Lebensdauerrichtlinie für diese Instanz steuert.

(Geerbt von MarshalByRefObject)
GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
InitializeLifetimeService()
Veraltet.

Ruft ein Lebensdauerdienstobjekt ab, um die Lebensdauerrichtlinie für diese Instanz zu steuern.

(Geerbt von MarshalByRefObject)
MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
MemberwiseClone(Boolean)

Erstellt eine flache Kopie des aktuellen MarshalByRefObject-Objekts.

(Geerbt von MarshalByRefObject)
ObjectInvariant()
Veraltet.

Bietet Unterstützung für eine Contract.

Read(Byte[], Int32, Int32)

Wenn sie in einer abgeleiteten Klasse überschrieben werden, liest sie eine Bytesequenz aus dem aktuellen Datenstrom und wechselt die Position innerhalb des Datenstroms um die Anzahl der gelesenen Bytes.

Read(Span<Byte>)

Wenn sie in einer abgeleiteten Klasse überschrieben werden, liest sie eine Bytesequenz aus dem aktuellen Datenstrom und wechselt die Position innerhalb des Datenstroms um die Anzahl der gelesenen Bytes.

ReadAsync(Byte[], Int32, Int32)

Liest asynchron eine Abfolge von Bytes aus dem aktuellen Datenstrom und wechselt die Position innerhalb des Datenstroms um die Anzahl der gelesenen Bytes.

ReadAsync(Byte[], Int32, Int32, CancellationToken)

Liest asynchron eine Abfolge von Bytes aus dem aktuellen Datenstrom, wechselt die Position innerhalb des Datenstroms um die Anzahl der gelesenen Bytes und überwacht Abbruchanforderungen.

ReadAsync(Memory<Byte>, CancellationToken)

Liest asynchron eine Abfolge von Bytes aus dem aktuellen Datenstrom, wechselt die Position innerhalb des Datenstroms um die Anzahl der gelesenen Bytes und überwacht Abbruchanforderungen.

ReadAtLeast(Span<Byte>, Int32, Boolean)

Liest mindestens eine Minimale Anzahl von Bytes aus dem aktuellen Datenstrom und wechselt die Position innerhalb des Datenstroms um die Anzahl der gelesenen Bytes.

ReadAtLeastAsync(Memory<Byte>, Int32, Boolean, CancellationToken)

Liest asynchron mindestens eine Mindestanzahl von Bytes aus dem aktuellen Datenstrom, wechselt die Position innerhalb des Datenstroms um die Anzahl der gelesenen Bytes und überwacht Abbruchanforderungen.

ReadByte()

Liest ein Byte aus dem Datenstrom und wechselt die Position innerhalb des Datenstroms um ein Byte oder gibt -1 zurück, wenn am Ende des Datenstroms.

ReadExactly(Byte[], Int32, Int32)

Liest count Anzahl von Bytes aus dem aktuellen Datenstrom und wechselt die Position innerhalb des Datenstroms.

ReadExactly(Span<Byte>)

Liest Bytes aus dem aktuellen Datenstrom und wechselt die Position innerhalb des Datenstroms, bis die buffer gefüllt ist.

ReadExactlyAsync(Byte[], Int32, Int32, CancellationToken)

Liest asynchron count Anzahl von Bytes aus dem aktuellen Datenstrom, wechselt die Position innerhalb des Datenstroms und überwacht Abbruchanforderungen.

ReadExactlyAsync(Memory<Byte>, CancellationToken)

Liest asynchron Bytes aus dem aktuellen Datenstrom, wechselt die Position innerhalb des Datenstroms, bis die buffer gefüllt ist, und überwacht Abbruchanforderungen.

Seek(Int64, SeekOrigin)

Wenn sie in einer abgeleiteten Klasse überschrieben wird, wird die Position innerhalb des aktuellen Datenstroms festgelegt.

SetLength(Int64)

Wenn sie in einer abgeleiteten Klasse überschrieben wird, wird die Länge des aktuellen Datenstroms festgelegt.

Synchronized(Stream)

Erstellt einen threadsicheren (synchronisierten) Wrapper um das angegebene Stream-Objekt.

ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)
ValidateBufferArguments(Byte[], Int32, Int32)

Überprüft argumente, die lese- und schreibmethoden für Streambereitgestellt werden.

ValidateCopyToArguments(Stream, Int32)

Überprüft die Argumente, die den Methoden CopyTo(Stream, Int32) oder CopyToAsync(Stream, Int32, CancellationToken) bereitgestellt werden.

Write(Byte[], Int32, Int32)

Wenn sie in einer abgeleiteten Klasse überschrieben wird, wird eine Bytesequenz in den aktuellen Datenstrom geschrieben und die aktuelle Position innerhalb dieses Datenstroms um die Anzahl der geschriebenen Bytes vorangestellt.

Write(ReadOnlySpan<Byte>)

Wenn sie in einer abgeleiteten Klasse überschrieben wird, wird eine Bytesequenz in den aktuellen Datenstrom geschrieben und die aktuelle Position innerhalb dieses Datenstroms um die Anzahl der geschriebenen Bytes vorangestellt.

WriteAsync(Byte[], Int32, Int32)

Schreibt asynchron eine Bytesequenz in den aktuellen Datenstrom und wechselt die aktuelle Position innerhalb dieses Datenstroms um die Anzahl der geschriebenen Bytes.

WriteAsync(Byte[], Int32, Int32, CancellationToken)

Schreibt asynchron eine Bytesequenz in den aktuellen Datenstrom, wechselt die aktuelle Position innerhalb dieses Datenstroms um die Anzahl der geschriebenen Bytes und überwacht Abbruchanforderungen.

WriteAsync(ReadOnlyMemory<Byte>, CancellationToken)

Schreibt asynchron eine Bytesequenz in den aktuellen Datenstrom, wechselt die aktuelle Position innerhalb dieses Datenstroms um die Anzahl der geschriebenen Bytes und überwacht Abbruchanforderungen.

WriteByte(Byte)

Schreibt ein Byte in die aktuelle Position im Datenstrom und wechselt die Position innerhalb des Datenstroms um ein Byte.

Explizite Schnittstellenimplementierungen

IDisposable.Dispose()

Gibt alle vom Streamverwendeten Ressourcen frei.

Erweiterungsmethoden

CopyToAsync(Stream, PipeWriter, CancellationToken)

Liest die Bytes asynchron aus dem Stream und schreibt sie mithilfe eines Abbruchtokens in das angegebene PipeWriter.

AsInputStream(Stream)

Konvertiert einen verwalteten Stream in .NET für Windows Store-Apps in einen Eingabedatenstrom in der Windows-Runtime.

AsOutputStream(Stream)

Konvertiert einen verwalteten Stream in .NET für Windows Store-Apps in einen Ausgabedatenstrom in der Windows-Runtime.

AsRandomAccessStream(Stream)

Konvertiert den angegebenen Datenstrom in einen Datenstrom mit wahllosem Zugriff.

ConfigureAwait(IAsyncDisposable, Boolean)

Konfiguriert, wie auf die von einem asynchronen Einweg zurückgegebenen Aufgaben gewartet wird.

Gilt für:

Weitere Informationen