다음을 통해 공유


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 클래스에서 파생됩니다. Button 컨트롤에 대한 Click 이벤트 처리기는 비동기 메서드를 호출하므로 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 상속하는 일반적으로 사용되는 스트림 중 일부는 FileStreamMemoryStream.

기본 데이터 원본 또는 리포지토리에 따라 스트림은 이러한 기능 중 일부만 지원할 수 있습니다. Stream 클래스의 CanRead, CanWriteCanSeek 속성을 사용하여 스트림의 기능을 쿼리할 수 있습니다.

ReadWrite 메서드는 다양한 형식으로 데이터를 읽고 씁니다. 검색을 지원하는 스트림의 경우 SeekSetLength 메서드와 PositionLength 속성을 사용하여 스트림의 현재 위치와 길이를 쿼리하고 수정합니다.

이 형식은 IDisposable 인터페이스를 구현합니다. 형식 사용을 마쳤으면 직접 또는 간접적으로 삭제해야 합니다. 형식을 직접 삭제하려면 try/catch 블록에서 해당 Dispose 메서드를 호출합니다. 간접적으로 삭제하려면 using(C#) 또는 Using(Visual Basic)와 같은 언어 구문을 사용합니다. 자세한 내용은 IDisposable 인터페이스 항목의 "IDisposable을 구현하는 개체 사용" 섹션을 참조하세요.

Stream 개체를 삭제하면 버퍼링된 데이터가 플러시되고 기본적으로 Flush 메서드가 호출됩니다. 또한 Dispose 파일 핸들, 네트워크 연결 또는 내부 버퍼링에 사용되는 메모리와 같은 운영 체제 리소스를 해제합니다. BufferedStream 클래스는 읽기 및 쓰기 성능을 향상시키기 위해 버퍼링된 스트림을 다른 스트림 주위에 래핑하는 기능을 제공합니다.

.NET Framework 4.5부터 Stream 클래스에는 비동기 작업을 간소화하는 비동기 메서드가 포함되어 있습니다. 비동기 메서드는 이름에 ReadAsync, WriteAsync, CopyToAsyncFlushAsync같은 Async 포함합니다. 이러한 메서드를 사용하면 주 스레드를 차단하지 않고 리소스 집약적 I/O 작업을 수행할 수 있습니다. 이 성능 고려 사항은 시간이 많이 걸리는 스트림 작업이 UI 스레드를 차단하고 앱이 작동하지 않는 것처럼 표시되도록 할 수 있는 Windows 8.x 스토어 앱 또는 데스크톱 앱에서 특히 중요합니다. 비동기 메서드는 Visual Basic 및 C#의 asyncawait 키워드와 함께 사용됩니다.

Windows 8.x 스토어 앱에서 사용되는 경우 StreamAsInputStreamAsOutputStream두 가지 확장 메서드를 포함합니다. 이러한 메서드는 Stream 개체를 Windows 런타임의 스트림으로 변환합니다. AsStreamForReadAsStreamForWrite 메서드를 사용하여 Windows 런타임의 스트림을 Stream 개체로 변환할 수도 있습니다. 자세한 내용은 방법: .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 바이트씩 이동하거나 스트림의 끝에 있는 경우 -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)

스트림의 현재 위치에 바이트를 쓰고 스트림 내의 위치를 1 바이트씩 진행합니다.

명시적 인터페이스 구현

IDisposable.Dispose()

Stream사용하는 모든 리소스를 해제합니다.

확장 메서드

CopyToAsync(Stream, PipeWriter, CancellationToken)

취소 토큰을 사용하여 Stream 바이트를 비동기적으로 읽고 지정된 PipeWriter씁니다.

AsInputStream(Stream)

Windows 스토어 앱용 .NET의 관리되는 스트림을 Windows 런타임의 입력 스트림으로 변환합니다.

AsOutputStream(Stream)

Windows 스토어 앱용 .NET의 관리되는 스트림을 Windows 런타임의 출력 스트림으로 변환합니다.

AsRandomAccessStream(Stream)

지정된 스트림을 임의 액세스 스트림으로 변환합니다.

ConfigureAwait(IAsyncDisposable, Boolean)

비동기 삭제 가능 파일에서 반환된 작업에 대한 대기가 수행되는 방법을 구성합니다.

적용 대상

추가 정보