StreamWriter
System.IO.StreamWriter는 문자열 데이터를 스트림에 저장하는 데 쓰인다.
BinaryWriter와 다르게 파일 경로를 통해 바로 FileStream을 OpenOrCreate한다.
⭐ Stream
스트림은 단순하게 말하면 Binary Buffer이다. 이진데이터는 주로 통신 및 I/O 로직에 사용된다.
e.g. System.IO.MemoryStream, System.IO.FileStream, System.Net.Sockets.NetworkStream 등 StreamWriter의 BaseStream이 된다. 스트림 종류 더보기
WriteLine, Flush
WriteLine()은 StreamWriter._charBuffer에 문자열을 저장하는 함수고,
Flush()는 StreamWriter._charBuffer값을 BaseStream._buffer에 옮겨 담는 함수다.
✏️ 더 알아보기
내부적으로 StreamWriter가 Close()될 때 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 |
---|
댓글