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.

В зависимости от базового источника данных или репозитория потоки могут поддерживать только некоторые из этих возможностей. Поток можно запрашивать для своих возможностей с помощью CanReadCanWriteсвойств класса и 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, , WriteAsyncCopyToAsyncи FlushAsync. Эти методы позволяют выполнять ресурсоемкие операции ввода-вывода без блокировки основного потока. Это соображение, связанное с производительностью, особенно важно в приложениях Магазина 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) будут работать правильно с асинхронными методами. Реализации по умолчанию и WriteByte(Byte) создание массива ReadByte() байтов с одним элементом, а затем вызовите реализации Read(Byte[], Int32, Int32) и Write(Byte[], Int32, Int32). При наследовлении Streamрекомендуется переопределить эти методы для доступа к внутреннему буферу, если он имеется, для значительно более высокой производительности. Также необходимо предоставить реализации CanRead, , CanSeekCanWrite, 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)

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

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

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