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свойств Stream , CanWriteи CanSeek класса .

Методы 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. Эти методы позволяют выполнять ресурсоемкие операции ввода-вывода, не блокируя поток main. Это соображение, связанное с производительностью, особенно важно в приложениях Магазина Windows 8.x и классических приложениях, в которых длительная потоковая операция может блокировать поток пользовательского интерфейса и создавать впечатление, что приложение не работает. Асинхронные методы используются в сочетании с ключевыми словами async и await в Visual Basic и C#.

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

Некоторые реализации потока выполняют локальную буферизацию базовых данных для повышения производительности. Для таких потоков можно использовать 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.

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

AsInputStream(Stream)

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

AsOutputStream(Stream)

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

AsRandomAccessStream(Stream)

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

ConfigureAwait(IAsyncDisposable, Boolean)

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

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

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