StreamWriter/StreamReader 클래스

00·2025년 1월 1일

C#

목록 보기
108/149
using System;
using System.IO; // 파일 입출력을 위한 네임스페이스


/*
.NET은 텍스트 파일을 쓰고 읽을 수 있도록 StreamWriter/StreamReader 클래스를 제공합니다.

바이너리 파일을 쓰고 읽을 수 있도록 BinaryWriter/BinaryReader 클래스를 제공한 것과 같음.
 */


// StreamWriter/StreamReader 클래스를 사용하여,
// 다양한 데이터 타입의 값을 텍스트 파일("a.txt")에 쓰고 읽는 프로그램
namespace TextFile
{
    class MainApp
    {
        static void Main(string[] args)
        {
            using (StreamWriter sw = 
                new StreamWriter( // FileStream 객체를 사용하여 StreamWriter 객체를 생성합니다.
                                  // StreamWriter는 FileStream을 통해 파일에 접근하고 데이터를 씁니다.
                    new FileStream("a.txt", FileMode.Create))) // "a.txt"라는 텍스트 파일을 생성하고,
                                                               // 쓰기 모드로 여는 FileStream 객체(스트림)를 생성합니다.
                                                               // 이 객체는 StreamReader 객체에 전달되어,
                                                               // StreamReader가 파일에 텍스트를 쓸 수 있도록 합니다.
                                                               // 만약 파일이 이미 존재하면 기존 내용을 덮어씁니다.
            {
               // Write() 메서드와 WriteLine() 메서드는 C#이 제공하는 모든 기본 데이터 형식에 대해 오버로딩되어 있습니다.
                sw.WriteLine(int.MaxValue); // int 최댓값을 파일에 씀
                sw.WriteLine("Good morning!"); // 문자열 "Good morning!"을 파일에 씀
                sw.WriteLine(uint.MaxValue); // uint 최댓값을 파일에 씀
                sw.WriteLine("안녕하세요!"); // 문자열 "안녕하세요!"를 파일에 씀
                sw.WriteLine(double.MaxValue); // double 최댓값을 파일에 씀
            } // using 블록 종료 시 sw.Close() 자동 호출


            using (StreamReader sr =
                new StreamReader( 
                    new FileStream("a.txt", FileMode.Open))) // "a.txt" 파일을 열고 StreamReader 객체 sr를 사용하여 파일에서 읽을 수 있도록 합니다.
                                                             // using 문을 사용하면 sr 객체를 사용한 후 자동으로 Close() 메서드가 호출되어 파일이 닫힙니다.
            {
                Console.WriteLine($"File size : {sr.BaseStream.Length} bytes");  // 파일 크기 출력

                while (sr.EndOfStream == false) // 파일의 끝에 도달할 때까지 반복
                {
                    Console.WriteLine(sr.ReadLine()); // 파일에서 한 줄씩 읽어서 출력
                }
            } // using 블록 종료 시 sr.Close() 자동 호출
        }
    }
}


/*
출력 결과

File size : 82 bytes
2147483647
Good morning!
4294967295
안녕하세요!
1.7976931348623157E+308
 */

코드 설명

using System;
using System.IO; // 파일 입출력을 위한 네임스페이스

namespace TextFile
{
    class MainApp
    {
        static void Main(string[] args)
        {
            using (StreamWriter sw = new StreamWriter(new FileStream("a.txt", FileMode.Create))) // "a.txt" 파일을 생성하고 StreamWriter로 연결
            { 
                sw.WriteLine(int.MaxValue); // int 최댓값을 파일에 씀
                sw.WriteLine("Good morning!"); // 문자열 "Good morning!"을 파일에 씀
                sw.WriteLine(uint.MaxValue); // uint 최댓값을 파일에 씀
                sw.WriteLine("안녕하세요!"); // 문자열 "안녕하세요!"를 파일에 씀
                sw.WriteLine(double.MaxValue); // double 최댓값을 파일에 씀
            } // using 블록 종료 시 sw.Close() 자동 호출

            using (StreamReader sr = new StreamReader(new FileStream("a.txt", FileMode.Open))) // "a.txt" 파일을 열고 StreamReader로 연결
            { 
                Console.WriteLine($"File size : {sr.BaseStream.Length} bytes"); // 파일 크기 출력

                while (sr.EndOfStream == false) // 파일의 끝에 도달할 때까지 반복
                {
                    Console.WriteLine(sr.ReadLine()); // 파일에서 한 줄씩 읽어서 출력
                }
            } // using 블록 종료 시 sr.Close() 자동 호출
        }
    }
}

코드 설명

이 C# 코드는 StreamWriterStreamReader를 사용하여 다양한 데이터 타입의 값을 텍스트 파일("a.txt")에 쓰고 읽는 예제입니다.

  • StreamWriter: 텍스트 형식으로 데이터를 파일에 쓰는 클래스입니다.
  • StreamReader: 텍스트 형식으로 파일에서 데이터를 읽는 클래스입니다.

Main 메서드

  • using (StreamWriter sw = new StreamWriter(new FileStream("a.txt", FileMode.Create))): "a.txt" 파일을 생성하고 StreamWriter 객체 sw를 사용하여 파일에 쓸 수 있도록 합니다. using 문을 사용하면 sw 객체를 사용한 후 자동으로 Close() 메서드가 호출되어 파일이 닫힙니다.
  • sw.WriteLine(int.MaxValue);: int 타입의 최댓값을 파일에 씁니다.
  • sw.WriteLine("Good morning!");: 문자열 "Good morning!"을 파일에 씁니다.
  • sw.WriteLine(uint.MaxValue);: uint 타입의 최댓값을 파일에 씁니다.
  • sw.WriteLine("안녕하세요!");: 문자열 "안녕하세요!"를 파일에 씁니다.
  • sw.WriteLine(double.MaxValue);: double 타입의 최댓값을 파일에 씁니다.
  • using (StreamReader sr = new StreamReader(new FileStream("a.txt", FileMode.Open))): "a.txt" 파일을 열고 StreamReader 객체 sr를 사용하여 파일에서 읽을 수 있도록 합니다. using 문을 사용하면 sr 객체를 사용한 후 자동으로 Close() 메서드가 호출되어 파일이 닫힙니다.
  • Console.WriteLine($"File size : {sr.BaseStream.Length} bytes");: 파일의 크기를 바이트 단위로 출력합니다.
  • while (sr.EndOfStream == false): 파일의 끝에 도달할 때까지 반복합니다.
  • Console.WriteLine(sr.ReadLine());: 파일에서 한 줄씩 읽어서 출력합니다.

출력 결과

File size : 74 bytes
2147483647
Good morning!
4294967295
안녕하세요!
1.7976931348623157E+308

FileStream 객체?

FileStream 객체는 "a.txt" 파일 자체가 아니라, "a.txt" 파일을 조작하기 위한 객체입니다.

FileStream 객체는 파일을 열고, 읽고, 쓰고, 닫는 등의 작업을 수행할 수 있도록 해주는 객체입니다.

이 코드에서 new FileStream("a.txt", FileMode.Create)는 "a.txt" 파일을 생성하고 쓰기 모드로 여는 FileStream 객체를 생성합니다. 이 객체는 StreamWriter 객체에 전달되어 StreamWriter가 파일에 텍스트를 쓸 수 있도록 합니다.

FileStream 객체는 익명 형식이 아니고, 이름이 없습니다.

익명 형식은 new { Name = "John", Age = 30 }과 같이 이름 없이 정의하는 형식입니다. FileStream 객체는 FileStream 클래스의 인스턴스이며, 익명 형식이 아닙니다.

이 코드에서 FileStream 객체는 변수에 할당되지 않았기 때문에 이름이 없습니다. 하지만 FileStream 객체를 변수에 할당하면 변수 이름을 통해 객체에 접근할 수 있습니다.

FileStream fileStream = new FileStream("a.txt", FileMode.Create);

이 코드에서는 fileStream이라는 변수에 FileStream 객체를 할당했습니다. 이제 fileStream 변수를 통해 FileStream 객체에 접근할 수 있습니다.


using (StreamWriter sw = new StreamWriter(new FileStream("a.txt", FileMode.Create)))

using (StreamWriter sw = new StreamWriter(new FileStream("a.txt", FileMode.Create))) 이 부분을 단계별로 자세히 설명.

1단계: 파일 생성 및 열기

new FileStream("a.txt", FileMode.Create) 부분은 "a.txt"라는 이름의 파일을 생성하고 쓰기 모드로 엽니다. 만약 "a.txt" 파일이 이미 존재한다면, 기존 내용을 지우고 새롭게 덮어씁니다.

FileStream 클래스는 '파일을 읽고 쓰는 데 사용'되는 클래스입니다. 생성자의 첫 번째 매개변수는 '파일 경로', 두 번째 매개변수는 '파일 모드'를 나타냅니다. FileMode.Create는 파일을 생성하고 쓰기 모드로 여는 모드입니다.

2단계: StreamWriter 객체 생성

new StreamWriter(...) 부분은 StreamWriter 클래스의 객체를 생성합니다. StreamWriter는 텍스트 형식으로 데이터를 파일에 쓰는 데 사용되는 클래스입니다. 즉, 문자열을 파일에 쓸 때 사용합니다.

StreamWriter 생성자의 매개변수로 FileStream 객체를 전달합니다. 이는 StreamWriterFileStream을 통해 파일에 접근하고 데이터를 쓰도록 하기 위함입니다.

3단계: using 문

using (StreamWriter sw = ...) 부분은 using 문을 사용하여 StreamWriter 객체를 생성합니다. using 문은 StreamWriter 객체를 사용한 후 자동으로 Close() 메서드를 호출하여 파일을 닫습니다. 이는 파일을 열고 사용한 후 명시적으로 닫지 않아 발생할 수 있는 리소스 누수를 방지하는 데 도움이 됩니다.

요약

  1. new FileStream("a.txt", FileMode.Create): "a.txt" 파일을 생성하고 쓰기 모드로 엽니다.
  2. new StreamWriter(...): FileStream 객체를 사용하여 StreamWriter 객체를 생성합니다.
  3. using (StreamWriter sw = ...): using 문을 사용하여 StreamWriter 객체를 생성하고, 사용 후 자동으로 파일을 닫습니다.

using (StreamReader sr = new StreamReader(new FileStream("a.txt", FileMode.Open)))

이 코드는 StreamReader 클래스를 사용하여 "a.txt" 파일의 내용을 읽어오기 위한 객체 sr을 생성하고, using 문을 사용하여 파일을 자동으로 닫는 역할을 합니다.

StreamReader는 텍스트 파일을 읽어오는 데 특화된 클래스입니다. 즉, 파일에서 문자열을 읽어올 때 사용합니다.

이 코드는 다음과 같은 단계로 실행됩니다.

  1. new FileStream("a.txt", FileMode.Open): "a.txt" 파일을 읽기 모드(FileMode.Open)로 엽니다. 파일이 존재하지 않으면 예외가 발생합니다.

  2. new StreamReader(...): FileStream 객체를 사용하여 StreamReader 객체를 생성합니다. StreamReaderFileStream을 통해 파일에 접근하고 데이터를 읽어옵니다.

  3. using (StreamReader sr = ...): StreamReader 객체 srusing 문으로 감싸서, using 블록을 벗어날 때 자동으로 sr.Close() 메서드가 호출되도록 합니다. 이는 파일을 사용한 후 명시적으로 닫지 않아 발생할 수 있는 리소스 누수를 방지하는 데 도움이 됩니다.

요약하자면, 이 코드는 "a.txt"라는 텍스트 파일을 열고, StreamReader 객체를 사용하여 파일의 내용을 읽어올 수 있도록 준비합니다. using 문을 사용하여 파일을 자동으로 닫아 리소스 누수를 방지합니다.

0개의 댓글