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 되는 더 일반적으로 사용되는 스트림 중 일부는 다음과 MemoryStream같습니다FileStream.

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

Write 메서드는 Read 다양한 형식으로 데이터를 읽고 씁니다. 검색을 지원하는 스트림의 경우 스트림의 Seek SetLength 현재 위치와 Position Length 길이를 쿼리하고 수정하려면 해당 및 메서드 및 속성을 사용합니다.

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

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

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

Windows 8.x 스토어 앱에서 사용되는 경우 두 가지 확장 메서드 AsInputStreamStream AsOutputStream. 이러한 메서드는 개체를 Stream Windows 런타임 스트림으로 변환합니다. 및 메서드를 사용하여 AsStreamForRead AsStreamForWrite Windows 런타임 스트림을 Stream 개체로 변환할 수도 있습니다. 자세한 내용은 방법: .NET Framework 스트림 및 Windows 런타임 스트림 간의 변환을 참조하세요.

일부 스트림 구현은 기본 데이터의 로컬 버퍼링을 수행하여 성능을 향상시킵니다. 이러한 스트림의 Flush 경우 또는 FlushAsync 메서드를 사용하여 내부 버퍼를 지우고 모든 데이터가 기본 데이터 원본 또는 리포지토리에 기록되었는지 확인할 수 있습니다.

백업 저장소(비트 버킷이라고도 함)가 없는 스트림이 필요한 경우 필드를 사용하여 Null 이 용도로 설계된 스트림의 인스턴스를 검색합니다.

구현자 참고

파생 클래스를 Stream구현하는 경우 및 Write(Byte[], Int32, Int32) 메서드에 대한 구현을 Read(Byte[], Int32, Int32) 제공해야 합니다. 비동기 메서드ReadAsync(Byte[], Int32, Int32)WriteAsync(Byte[], Int32, Int32)는 동기 메서드 Read(Byte[], Int32, Int32)CopyToAsync(Stream) Write(Byte[], Int32, Int32) 해당 구현에서 사용합니다. 따라서 구현이 Read(Byte[], Int32, Int32) Write(Byte[], Int32, Int32) 비동기 메서드와 올바르게 작동합니다. 새 단일 요소 바이트 배열의 ReadByte() 기본 구현 및 WriteByte(Byte) 만든 다음 구현을 호출합니다Write(Byte[], Int32, Int32).Read(Byte[], Int32, Int32) 파생 Stream되는 경우 성능을 크게 향상하기 위해 내부 버퍼에 액세스하기 위해 이러한 메서드를 재정의하는 것이 좋습니다. 또한 , ,CanSeek, LengthCanWriteFlush()PositionSeek(Int64, SeekOrigin)SetLength(Int64)CanRead구현을 제공해야 합니다.

메서드를 재정의 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)

현재 스트림에서 바이트의 시퀀스를 비동기적으로 읽고 읽은 바이트 수만큼 스트림 내에서 앞으로 이동하며 취소 요청을 모니터링합니다.

ReadByte()

스트림에서 바이트를 읽고 스트림 내 위치를 한 바이트씩 앞으로 이동하거나 스트림 끝일 경우 -1을 반환합니다.

Seek(Int64, SeekOrigin)

파생 클래스를 재정의될 때 현재 스트림 내의 위치를 설정합니다.

SetLength(Int64)

파생 클래스에 재정의될 때 현재 스트림의 길이를 설정합니다.

Synchronized(Stream)

지정된 Stream 개체에 대해 동기화되어 스레드로부터 안전한 래퍼를 만듭니다.

ToString()

현재 개체를 나타내는 문자열을 반환합니다.

(다음에서 상속됨 Object)
ValidateBufferArguments(Byte[], Int32, Int32)

에서 메서드를 읽고 쓰는 데 제공된 인수의 유효성을 검사합니다 Stream.

ValidateCopyToArguments(Stream, Int32)

또는 CopyToAsync(Stream, Int32, CancellationToken) 메서드에 제공된 인수의 유효성을 CopyTo(Stream, Int32) 검사합니다.

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에서 사용하는 모든 리소스를 해제합니다.

확장 메서드

AsInputStream(Stream)

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

AsOutputStream(Stream)

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

AsRandomAccessStream(Stream)

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

ConfigureAwait(IAsyncDisposable, Boolean)

비동기 일회용에서 반환되는 작업을 대기하는 방법을 구성합니다.

적용 대상

추가 정보