본문 바로가기

Programming/C#

C# 파일 입출력 - Stream 클래스

반응형

 파일을 읽고 쓰기를 할 때 하드디스크의 정보를 메모리로 이동시켜 파일을 읽어 들이고 또는 파일 쓰기를 할 때는 메모리에 있는 내용을 하드디스크로 이동시킵니다. 이때 이 이동하는 경로를 스트림(Stream)이라고 합니다. 이번에는 이 스트림에 대해 알아보겠습니다.

 

1. 스트림 (Steam)

  프로그램을 작성하고 이를 저장할 때 하드디스크에 파일을 생성하고 내용을 저장합니다. 이럴 때 스트림을 이용하여 내용을 바이트 단위로 이동시켜 저장합니다. 파일을 읽어올 때도 마찬가지입니다.

스트림의 Write( ) 메서드를 사용하여 데이터를 스트림에 쓸 수 있으며, Read( ) 메서드를 이용하여 파일, 네트워크, 메모리 등에서 데이터를 읽어올 수 있습니다. 또한, Seek( ) 메서드를 사용하여 스트림 내의 특정 위치에 있는 데이터를 읽어 올 수도 있습니다.

 

 

 

 

C#에서 파일 입출력을 하기 위해 사용하는 클래스가 Stream 클래스입니다. 엄밀히 말하면 이 Stream 클래스에서 파생된 클래스를 이용합니다.

 

Stream 클래스의 파생 클래스는 다음과 같습니다.

 

 - FileStream : 파일 열기 및 닫기, 파일 읽기 및 쓰기 

 - NetworkStream : 네트워크 액세스를 위한 데이터 기본 스트림 제공

 - MemoryStream : 백업 저장소가 메모리인 스트림을 생성

 - BufferedStream : 다른 스트림에서 작업을 읽고 쓰기 위한 버퍼링 레이어 추가

 

2. 스트림 클래스 사용하기

 스트림 클래스를 사용하기 위해서는 우선 using 선언을 해야합니다.

 

   using System.IO

 

이와 같이 선언을 하고 나서 new 연산자를 이용하여 스트림 클래스의 파생 클래스들을 사용합니다.

 

 2.1 파일 스트림(FileStream)

    파일 입출력을 다루는 기본 클래스로 다음과 같이 사용합니다.

 

       FileStream 이름 = new FileStream("파일명", 형식);

 

  파일 스트림은 매개변수로 바이트 형식의 데이터 또는 배열로 읽거나 저장합니다. 파일 읽기 및 저장이 완료되면 반드시 파일 닫기를 하여야 합니다.

형식에서 사용되는 FileMode에 대해 알아보겠습니다.

 

 2.2 FileStream의 형식(FileMode)

   FileStream을 사용하여 파일을 작성할 때는 다음과 같이 작업을 하게 됩니다.

  ① 새로운 FileStream 객체를 생성하고 파일에 데이터를 작성합니다.

  ② FileStream 자체에 파일을 첨부합니다.

  ③ 스트림은 바이트 형태로 파일을 작성하므로 작성하려는 문자열을 바이트 배열로 변환합니다.

     이를 엔코딩(encoding)이라 합니다.

  ④ 스트림의 Write( ) 메서드를 호출하여 바이트 배열을 매개변수에 전달합니다.

  ⑤ 다른 프로그램에서도 파일에 접근할 수 있도록 파일을 닫습니다.

 

  FileStream을 사용할 때 형식에 사용하게 되는 FileMode를 아래 표에 정리하였습니다.

FileMode 설 명
Append 기존 파일을 열면서 기존 저장된 내용을 유지하고 그 다음부터 저장
Create 새 파일을 생성하며 파일이 이미 있을 경우는 덮어씀
CreateNew 새 파일을 생성하며 파일이 이미 있을 경우 에러 표시
Open 기존 파일을 열며 파일이 없는 경우 에러 표시
OpenOrCreate 파일이 이미 있으면 파일을 열고, 파일이 없으면 새 파일을 생성
Truncate 기존 파일의 파일 내용을 지우고 열음

 

 

 

 

2.3 StreamWriter

  StreamWriter 클래스를 이용하면 파일 쓰기가 수월해집니다. 사용방법은 new 연산자를 사용하여 다음과 같이 사용합니다.

 

  StreamWriter 이름 = new StreamWriter(파일명, 형식)

 

파일명을 StreamWriter( ) 생성자에 전달하여 파일을 열도록 합니다.

형식에는 true 또는 false를 사용하는데, true일 경우 파일의 내용을 유지하며 그다음에 데이터를 저장하지만 false이면 기존 내용을 삭제하고 새롭게 작성합니다.

 

StreamWriter( )는 메서드로 Write와 WriteLine을 사용할 수 있으며 Console 클래스에 있는 것과 기능이 동일합니다.

 

작업을 완료하고 파일을 닫으려면 close( ) 메서드를 사용합니다.

 

파일을 읽을 때는 StreamReader( )를 사용하며 사용 방식은 StreamWriter( )와 같이 new 연산자를 이용합니다.

 

3. using 사용하기

 파일을 쓰기 위해 파일을 열거나 생성하고 데이터를 쓴 후에 close 메서드를 이용하여 파일을 반드시 닫아주어야 합니다. 하지만, 프로그래밍을 하다 보면 이를 깜박하는 경우가 많습니다. 이럴 경우 에러가 발생하게 되고 이 부분을 찾아 수정하게 되는 번거로운 작업이 추가되는 경우가 종종 있습니다.

 

이런 실수를 미연에 방지하기 위해 using을 사용합니다. using은 네임스페이스를 참조하려고 사용을 하지만 그 외에도 StreamWriter 등과 함께 사용하면 사용한 파일을 자동으로 닫아줄 수 있습니다.

 

 

 

 

4. 예제로 확인

Visual Studio를 여시고 C# 콘솔 애플리케이션을 생성합니다.

생성된 코드 창에 다음과 같이 작성합니다.

 

   using System;

   using System.IO;

 

   namespace 파일입출력

   {

      class Program

      {

         static void Main(string[] args)

         {

            float value = 3.14f;

            string str = "Hello World!";

            StreamWriter sw = new StreamWriter("test.txt");

            sw.WriteLine(value);

            sw.WriteLine(str);

            sw.Close();

         }

      }

   }

 

sw라는 이름으로 StreamWriter를 생성하고 생성한 변수들의 내용을 test.txt 파일에 입력하는 내용입니다. 그리고, 마지막에 파일을 닫기 위해 sw.Close();를 작성하였습니다. 생성한 파일은 프로젝트 폴더 내에 bin 폴더 안에 Debug 폴더에 저장됩니다.

 

다른 위치에 파일을 저장하고자 한다면 "test.txt"를 해당 경로와 함께 파일명을 작성해야 합니다. 그리고, 작성한 내용 중에 개행 문자와 동일한 내용이 나오면 이를 개행 문자로 인식하게 되어 되는데 이를 방지하기 위해 큰따옴표 앞에 @를 입력하여 이를 방지합니다. ( @"경로\파일명" )

 

using을 사용하여 위의 코드를 다음과 같이 변경합니다.

 

   using System;

   using System.IO;

 

   namespace sample

   {

      class Program

      {

         static void Main(string[] args)

         {

            float value = 3.14f;

            string str = "Hello World!";

            using (StreamWriter sw = new StreamWriter(@"c:\test.txt"))

               {

                  sw.WriteLine(value);

                  sw.WriteLine(str);

               }

         }

      }

   }

 

using을 사용하여 close( ) 메서드를 사용하여 파일 닫기를 하지 않았지만 에러 없이 파일이 c드라이브에 저장됩니다.

 

반응형