프로그래밍/C#

C# 파일 I/O 스트림의 이해와 활용

shimdh 2025. 8. 30. 00:08
728x90

프로그래밍에서 파일 입출력(I/O)은 필수적인 개념으로, 특히 C#에서는 파일 I/O 스트림을 이해하는 것이 데이터 저장, 조작 및 검색을 효과적으로 처리하는 데 중요합니다. 이번 블로그 포스트에서는 파일 I/O 스트림의 목적, 유형 및 실용적인 예제를 통해 C#에서의 파일 처리 방법을 깊이 있게 살펴보겠습니다.

파일 I/O 스트림의 목적

스트림은 데이터를 순차적으로 읽거나 쓸 수 있도록 하는 추상화입니다. C#의 System.IO 네임스페이스는 다양한 유형의 스트림을 다루기 위한 여러 클래스를 제공합니다. 스트림의 주된 목적은 애플리케이션과 하드 드라이브와 같은 외부 저장 장치 간의 효율적인 데이터 전송을 촉진하는 것입니다.

728x90

스트림의 유형

1. FileStream

파일을 읽거나 쓰는 데 사용됩니다. 파일의 바이트를 직접 다룰 수 있어 텍스트 파일뿐만 아니라 바이너리 파일에도 적합합니다.

2. MemoryStream

데이터를 디스크 대신 메모리에 저장합니다. 메모리에서의 빠른 데이터 접근이 필요할 때 유용합니다.

3. BufferedStream

읽기/쓰기 성능을 향상시키기 위한 임시 저장 버퍼를 제공합니다. 대량의 데이터를 처리할 때 성능을 개선할 수 있습니다.

4. CryptoStream

데이터가 스트림을 통해 흐를 때 암호화 변환을 수행할 수 있게 합니다. 보안이 중요한 데이터 전송에 사용됩니다.

주요 개념

  • 데이터 읽기: 파일 스트림을 읽기 목적으로 열고 그 내용을 검색하는 작업을 포함합니다.
  • 데이터 쓰기: 읽기와 유사하지만 프로그램에서 파일로 정보를 보내는 데 중점을 둡니다.
  • 스트림 닫기: 작업이 완료된 후 항상 스트림을 닫는 것이 중요합니다. 이는 시스템 리소스를 해제합니다.

실용적인 예제

파일에서 읽기

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string path = "example.txt";

        // FileStream 열기
        using (FileStream fs = new FileStream(path, FileMode.Open))
        {
            // StreamReader 객체 생성
            using (StreamReader reader = new StreamReader(fs))
            {
                string content = reader.ReadToEnd(); // 모든 내용 읽기
                Console.WriteLine(content);
            }
        }
    }
}

이 예제에서는 FileStream을 사용하여 텍스트 파일을 읽고, StreamReader를 통해 파일의 모든 내용을 읽습니다.

파일에 쓰기

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string path = "output.txt";

        // FileStream을 쓰기 위해 열기
        using (FileStream fs = new FileStream(path, FileMode.Create))
        {
            // StreamWriter 객체 생성
            using (StreamWriter writer = new StreamWriter(fs))
            {
                writer.WriteLine("Hello World!");  // output.txt에 줄 쓰기
                writer.WriteLine("This is an example.");
            }
        }
    }
}

이 예제에서는 StreamWriter를 사용하여 텍스트를 파일에 씁니다. FileMode.Create를 사용하여 새 파일을 생성하거나 기존 파일을 덮어씁니다.

바이너리 파일 작업

using System;
using System.IO;

class Program 
{
    static void Main() 
    {
        byte[] imageData; 

        // 이미지 파일에서 바이너리 데이터 읽기 
        using(FileStream fsRead = new FileStream("image.jpg", FileMode.Open)) 
        { 
            imageData = new byte[fsRead.Length]; 
            fsRead.Read(imageData, 0, imageData.Length); 
         }

         // 바이너리 데이터를 다른 이미지 파일에 다시 쓰기  
         using(FileStream fsWrite = new FileStream("copy_image.jpg", FileMode.Create)) 
         { 
             fsWrite.Write(imageData, 0, imageData.Length); 
         }  
     }  
}

이 예제에서는 JPEG 이미지 파일을 읽고, 그 데이터를 다른 파일에 씁니다. 이는 바이너리 데이터를 다루는 방법을 보여줍니다.

결론

C#에서 스트림을 통해 파일을 다루는 방법을 이해하면 개발자는 단순한 텍스트 문서뿐만 아니라 복잡한 바이너리 형식도 효율적으로 관리할 수 있습니다. 이러한 개념—읽기/쓰기 작업과 적절한 리소스 관리—을 숙달함으로써 지속적인 저장 솔루션을 포함한 강력한 소프트웨어 개발에 필요한 강력한 도구를 갖추게 됩니다.

728x90