본문 바로가기
C#/Stream

StreamWriter/Reader 이해하기: WriteLine, Flush

by PlaneK 2021. 7. 9.

StreamWriter

System.IO.StreamWriter는 문자열 데이터를 스트림에 저장하는 데 쓰인다.

BinaryWriter와 다르게 파일 경로를 통해 바로 FileStreamOpenOrCreate한다.

 Stream
스트림은 단순하게 말하면 Binary Buffer이다. 이진데이터는 주로 통신 및 I/O 로직에 사용된다.

e.g. System.IO.MemoryStream, System.IO.FileStream, System.Net.Sockets.NetworkStreamStreamWriter BaseStream이 된다. 스트림 종류 더보기

 

WriteLine, Flush

WriteLine()StreamWriter._charBuffer에 문자열을 저장하는 함수고,

Flush()StreamWriter._charBuffer값을 BaseStream._buffer에 옮겨 담는 함수다.

✏️ 더 알아보기
내부적으로 StreamWriterClose()될 때 Flush()가 호출된다.
StreamWriter._charBuffer는 실제 스트림에 옮기기 전 임시데이터라 볼 수 있다.

 

사용자가 임의로 Flush()를 실행하겠다는 의미는
Close()하지 않고 현재 입력된 버퍼를 BaseStream에 옮겨담겠다는 뜻이다.

✏️ 더 알아보기
Flush()의 정확한 동작은 _charPos를 0으로 리셋시키는 것이다.
_charBuffer를 클리어 하진 않는다.
_charPos의 역할은 메모장 내 커서와 같다.
_charPos가 가리키는 버퍼 위치에서부터 데이터가 채워지기 때문이다.

 

예제

WriteLine()Flush()가 어떤 동작을 하는지 살펴보자.

// MSDN 샘플코드
using System;
using System.IO;

namespace StreamStudy
{
    class Program
    {
        static void Main(string[] args)
        {
            DirectoryInfo[] cDirs = new DirectoryInfo(@"c:\").GetDirectories();

            if (File.Exists("CDriveDirs.txt"))
            {
                File.Delete("CDriveDirs.txt");
            }

            using (StreamWriter sw = new StreamWriter("CDriveDirs.txt"))
            {
                foreach (DirectoryInfo dir in cDirs)
                {
                    sw.WriteLine(dir.Name); 
                    sw.Flush();
                }
            }

            string line = "";
            using StreamReader sr = new StreamReader("CDriveDirs.txt");
            while ((line = sr.ReadLine()) != null)
            {
                Console.WriteLine(line);
            }
        }
    }
}

위 코드는 MSDN 샘플을 참고했다.

 

해당 경로의 디렉토리 리스트를 StreamWriter를 사용해 출력해보자.

StreamWriter개체는 위와 같은 초기상태를 갖는다.

생성한 메모장 파일(System.IO.FileStream)은 StreamWriter개체의 BaseStream이 된다.

 

WriteLine()을 실행하면 _charPos_charBuffer가 갱신된다.

 

BaseStream_charBuffer의 데이터를 Binary형태로 자신의 _buffer에 저장한다.

StreamWriter_charPos를 0으로 리셋한다.

따라서 다음 WriteLine()_charBuffer[0]에서 데이터 입력이 이뤄진다.

✏️ 더 알아보기
윈도우의 '\r'+'\n'는 '개행'을 나타낸다.
StreamReader.ReadLine()함수로 행 단위로 문자열을 읽어들일 수 있다.
cf. 운영체제마다 개행 포멧이 다르다.

 

_charPos가 가리키는 버퍼위치를 시작 인덱스로, 데이터가 입력된다.

 

BaseStream.Postion을 또는 BaseStream.Length_buffer에서 다음 값이 입력될 인덱스로 참조된다.

✏️ 더 알아보기
버퍼 내의 값, 0은 StreamReader.EndOfStream 값을 true로 변경한다. 즉, 0 = EOF

 

'C# > Stream' 카테고리의 다른 글

BinaryWriter/Reader 이해하기: Write, Read, vs StreamWriter  (0) 2021.07.12

댓글