Stream Класс

Определение

Предоставляет универсальное представление последовательности байтов. Это абстрактный класс.

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
Наследование
Stream
Наследование
Производный
Атрибуты
Реализации

Примеры

В следующем примере показано, как использовать два объекта FileStream для асинхронного копирования файлов из одного каталога в другой каталог. Класс FileStream является производным от класса Stream. Обратите внимание, что обработчик событий Click для элемента управления Button помечается модификатором async, так как вызывает асинхронный метод.

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

Комментарии

Stream является абстрактным базовым классом всех потоков. Поток — это абстракция последовательности байтов, например файла, входного и выходного устройства, канала обмена данными между процессами или сокета TCP/IP. Класс Stream и его производные классы предоставляют универсальное представление об этих различных типах входных и выходных данных, изолируйте программиста от конкретных сведений о операционной системе и базовых устройствах.

Потоки включают три основные операции:

  • Вы можете читать из потоков. Чтение — это передача данных из потока в структуру данных, например массив байтов.

  • Вы можете записывать в потоки. Запись — это передача данных из структуры данных в поток.

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

Некоторые из наиболее часто используемых потоков, наследуемых от Stream, являются FileStreamи MemoryStream.

В зависимости от базового источника данных или репозитория потоки могут поддерживать только некоторые из этих возможностей. Поток можно запросить для своих возможностей с помощью CanRead, CanWriteи CanSeek свойств класса Stream.

Методы Read и Write считывают и записывают данные в различных форматах. Для потоков, поддерживающих поиск, используйте методы Seek и SetLength и свойства Position и Length для запроса и изменения текущей позиции и длины потока.

Этот тип реализует интерфейс IDisposable. Завершив использование типа, его следует удалить напрямую или косвенно. Чтобы удалить тип напрямую, вызовите метод Dispose в блоке try/catch. Чтобы удалить его косвенно, используйте конструкцию языка, например using (в C#) или Using (в Visual Basic). Дополнительные сведения см. в разделе "Использование объекта, реализующего IDisposable" в разделе интерфейса IDisposable.

Удаление объекта Stream очищает все буферные данные и, по сути, вызывает метод Flush для вас. Dispose также освобождает ресурсы операционной системы, такие как дескриптора файлов, сетевые подключения или память, используемую для любого внутреннего буферизации. Класс BufferedStream предоставляет возможность упаковки буферизованного потока вокруг другого потока, чтобы повысить производительность чтения и записи.

Начиная с .NET Framework 4.5, класс Stream включает асинхронные методы для упрощения асинхронных операций. Асинхронный метод содержит Async в его имени, например ReadAsync, WriteAsync, CopyToAsyncи FlushAsync. Эти методы позволяют выполнять операции ввода-вывода с большим объемом ресурсов, не блокируя основной поток. Это особенно важно в приложении Магазина Windows 8.x или классическом приложении, где потребляющая много времени операция потока может заблокировать поток пользовательского интерфейса и сделать приложение как если бы оно не работало. Асинхронные методы используются вместе с ключевыми словами async и await в Visual Basic и C#.

При использовании в приложении Магазина Windows 8.x Stream включает два метода расширения: AsInputStream и AsOutputStream. Эти методы преобразуют объект Stream в поток в среде выполнения Windows. Вы также можете преобразовать поток в среду выполнения Windows в объект Stream с помощью методов AsStreamForRead и AsStreamForWrite. Дополнительные сведения см. в разделе How to: Convert Between .NET Framework Streams and Windows Runtime Streams

Некоторые реализации потоков выполняют локальную буферизацию базовых данных для повышения производительности. Для таких потоков можно использовать метод Flush или FlushAsync для очистки всех внутренних буферов и обеспечения записи всех данных в базовый источник данных или репозиторий.

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

Примечания для тех, кто реализует этот метод

При реализации производного класса Streamнеобходимо предоставить реализации для методов Read(Byte[], Int32, Int32) и Write(Byte[], Int32, Int32). Асинхронные методы ReadAsync(Byte[], Int32, Int32), WriteAsync(Byte[], Int32, Int32)и CopyToAsync(Stream) используют синхронные методы Read(Byte[], Int32, Int32) и Write(Byte[], Int32, Int32) в их реализации. Поэтому реализации Read(Byte[], Int32, Int32) и Write(Byte[], Int32, Int32) будут работать правильно с асинхронными методами. Реализации ReadByte() и WriteByte(Byte) по умолчанию создают новый массив байтов с одним элементом, а затем вызывают реализации Read(Byte[], Int32, Int32) и Write(Byte[], Int32, Int32). При производных от Streamрекомендуется переопределить эти методы для доступа к внутреннему буферу, если у вас есть, для значительно более эффективной производительности. Также необходимо предоставить реализации CanRead, CanSeek, CanWrite, Flush(), Length, Position, Seek(Int64, SeekOrigin)и SetLength(Int64).

Вместо этого не переопределите метод Close(), поместите всю логику очистки Stream в метод Dispose(Boolean). Дополнительные сведения см. в разделе Реализации метода Dispose.

Конструкторы

Stream()

Инициализирует новый экземпляр класса Stream.

Поля

Null

Stream без резервного хранилища.

Свойства

CanRead

При переопределении в производном классе получает значение, указывающее, поддерживает ли текущий поток чтение.

CanSeek

При переопределении в производном классе получает значение, указывающее, поддерживает ли текущий поток поиск.

CanTimeout

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

CanWrite

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

Length

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

Position

При переопределении в производном классе получает или задает позицию в текущем потоке.

ReadTimeout

Возвращает или задает значение в миллисекундах, которое определяет, сколько времени поток попытается прочитать до истечения времени ожидания.

WriteTimeout

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

Методы

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

Начинает асинхронную операцию чтения. (Вместо этого рекомендуется использовать ReadAsync(Byte[], Int32, Int32).)

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

Начинает асинхронную операцию записи. (Вместо этого рекомендуется использовать WriteAsync(Byte[], Int32, Int32).)

Close()

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

CopyTo(Stream)

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

CopyTo(Stream, Int32)

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

CopyToAsync(Stream)

Асинхронно считывает байты из текущего потока и записывает их в другой поток. Обе позиции потоков расширены по количеству скопированных байтов.

CopyToAsync(Stream, CancellationToken)

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

CopyToAsync(Stream, Int32)

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

CopyToAsync(Stream, Int32, CancellationToken)

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

CreateObjRef(Type)

Создает объект, содержащий все соответствующие сведения, необходимые для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.

(Унаследовано от MarshalByRefObject)
CreateWaitHandle()
Устаревшие..
Устаревшие..
Устаревшие..

Выделяет объект WaitHandle.

Dispose()

Освобождает все ресурсы, используемые Stream.

Dispose(Boolean)

Освобождает неуправляемые ресурсы, используемые Stream, и при необходимости освобождает управляемые ресурсы.

DisposeAsync()

Асинхронно освобождает неуправляемые ресурсы, используемые Stream.

EndRead(IAsyncResult)

Ожидает завершения ожидающего асинхронного чтения. (Вместо этого рекомендуется использовать ReadAsync(Byte[], Int32, Int32).)

EndWrite(IAsyncResult)

Завершает асинхронную операцию записи. (Вместо этого рекомендуется использовать WriteAsync(Byte[], Int32, Int32).)

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
Flush()

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

FlushAsync()

Асинхронно очищает все буферы для этого потока и приводит к записи всех буферных данных на базовое устройство.

FlushAsync(CancellationToken)

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

GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetLifetimeService()
Устаревшие..

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

(Унаследовано от MarshalByRefObject)
GetType()

Возвращает Type текущего экземпляра.

(Унаследовано от Object)
InitializeLifetimeService()
Устаревшие..

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

(Унаследовано от MarshalByRefObject)
MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
MemberwiseClone(Boolean)

Создает неглубокую копию текущего объекта MarshalByRefObject.

(Унаследовано от MarshalByRefObject)
ObjectInvariant()
Устаревшие..

Предоставляет поддержку Contract.

Read(Byte[], Int32, Int32)

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

Read(Span<Byte>)

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

ReadAsync(Byte[], Int32, Int32)

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

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

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

ReadAsync(Memory<Byte>, CancellationToken)

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

ReadAtLeast(Span<Byte>, Int32, Boolean)

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

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

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

ReadByte()

Считывает байт из потока и перемещает позицию в потоке по одному байту или возвращает -1, если в конце потока.

ReadExactly(Byte[], Int32, Int32)

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

ReadExactly(Span<Byte>)

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

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

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

ReadExactlyAsync(Memory<Byte>, CancellationToken)

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

Seek(Int64, SeekOrigin)

При переопределении в производном классе задает позицию в текущем потоке.

SetLength(Int64)

При переопределении в производном классе задает длину текущего потока.

Synchronized(Stream)

Создает потокобезопасную (синхронизированную) оболочку вокруг указанного объекта Stream.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)
ValidateBufferArguments(Byte[], Int32, Int32)

Проверяет аргументы, предоставляемые для чтения и записи методов на Stream.

ValidateCopyToArguments(Stream, Int32)

Проверяет аргументы, предоставляемые методами CopyTo(Stream, Int32) или CopyToAsync(Stream, Int32, CancellationToken).

Write(Byte[], Int32, Int32)

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

Write(ReadOnlySpan<Byte>)

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

WriteAsync(Byte[], Int32, Int32)

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

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

Асинхронно записывает последовательность байтов в текущий поток, перемещает текущую позицию в этом потоке по количеству записанных байтов и отслеживает запросы на отмену.

WriteAsync(ReadOnlyMemory<Byte>, CancellationToken)

Асинхронно записывает последовательность байтов в текущий поток, перемещает текущую позицию в этом потоке по количеству записанных байтов и отслеживает запросы на отмену.

WriteByte(Byte)

Записывает байт в текущую позицию в потоке и перемещает позицию в потоке по одному байту.

Явные реализации интерфейса

IDisposable.Dispose()

Освобождает все ресурсы, используемые Stream.

Методы расширения

CopyToAsync(Stream, PipeWriter, CancellationToken)

Асинхронно считывает байты из Stream и записывает их в указанный PipeWriterс помощью маркера отмены.

AsInputStream(Stream)

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

AsOutputStream(Stream)

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

AsRandomAccessStream(Stream)

Преобразует указанный поток в поток случайного доступа.

ConfigureAwait(IAsyncDisposable, Boolean)

Настраивает способ ожидания задач, возвращаемых из асинхронного удаления.

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

См. также раздел