Поделиться через


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.

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

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

Этот тип реализует 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 или классическом приложении, где потребляющая много времени операция потока может заблокировать поток пользовательского интерфейса и сделать приложение как если бы оно не работало. Асинхронные методы используются в сочетании с asyncawait ключевыми словами в 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, , CanSeekCanWriteFlush(), , 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, Int32)

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

CopyTo(Stream)

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

CopyToAsync(Stream, CancellationToken)

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

CopyToAsync(Stream, Int32, CancellationToken)

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

CopyToAsync(Stream, Int32)

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

CopyToAsync(Stream)

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

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, CancellationToken)

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

ReadAsync(Byte[], Int32, Int32)

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

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, CancellationToken)

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

WriteAsync(Byte[], Int32, Int32)

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

WriteAsync(ReadOnlyMemory<Byte>, CancellationToken)

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

WriteByte(Byte)

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

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

Имя Описание
IDisposable.Dispose()

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

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

Имя Описание
AsInputStream(Stream)

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

AsOutputStream(Stream)

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

AsRandomAccessStream(Stream)

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

ConfigureAwait(IAsyncDisposable, Boolean)

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

CopyToAsync(Stream, PipeWriter, CancellationToken)

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

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

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