Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

nomad-programmer

[Programming/C#] BinaryWriter / BinaryReader (바이너리 파일 처리) 본문

Programming/C#

[Programming/C#] BinaryWriter / BinaryReader (바이너리 파일 처리)

scii 2020. 9. 28. 18:10

FileStream 클래스는 파일 처리를 위한 모든 것을 갖고 있지만, 사용하기에 여간 불편한 것이 아니다. 특히 데이터를 저장할 때 반드시 byte 형식 또는 byte의 배열 형식으로 변환해야 한다는 문제가 있다. 이것은 파일로부터 데이터를 읽을 때도 마찬가지다.
.NET 프레임워크는 FileStream의 이런 불편함을 해소하기 위해 도우미 클래스들은 제공하고 있다. 바로 BinaryWriter와 BinaryReader 클래스가 그 예이다.

  • BinaryWriter : 스트림에 이진 데이터(Binary Data)를 기록하기 위한 목적으로 만들어진 클래스
  • BinaryReader : 스트림으로부터 이진 데이터를 읽어들이기 위한 목적으로 만들어진 클래스

이 두 클래스는 어디까지나 파일 처리의 도우미 역할을 할 뿐이기 때문에 이들 클래스들은 이용하려면 Stream으로부터 파생된 클래스의 인스턴스가 있어야 한다.
예를 들어 BinaryWriter와 FileStream을 함께 사용한다면 BinaryWriter의 이진 데이터 쓰기 기능을 파일 기록에 사용할 수 있고, NetworkStream과 함께 사용한다면 네트워크로 이진 데이터를 내보낼 수 있다.

BinaryWriter

// BinaryWriter를 FileStream과 함께 사용하는 예

BinaryWriter bw = new BinaryWriter(new FileStream("a.dat", FileMode.Create));

bw.Write(32);
bw.Write("Hello World");
bw.Write(3.14);

bw.Close();

BrinaryWriter의 생성자를 호출하면서 FileStream의 인스턴스를 매개 변수로 넘기고 있다. 이제 BinaryWriter의 객체는 FileStream의 인스턴스가 생성한 스트림에 대해 이진 데이터 기록을 수행한다. 

BinaryWriter의 Writer() 메소드는 C#이 제공하는 모든 기본 데이터 형식에 대해 오버로딩하고 있다.

BinaryReader

// BinaryReader를 이용해서 파일로부터 이진 데이터를 읽어오는 예

BinaryReader br = new BinaryReader(new FileStream("a.dat", FileMode.Open));

int a = br.ReadInt32();
string b = br.ReadString();
double c = br.ReadDouble();

br.Close();

BinaryWriter와 BinaryReader를 이용한 예제 프로그램

using System;
using System.IO;

namespace CSharpExample
{
    internal class MainApp
    {
        static int Main(string[] args)
        {
            BinaryWriter bw = new BinaryWriter(new FileStream("a.dat", FileMode.Create));

            bw.Write(int.MaxValue);
            bw.Write("Hello World!");
            bw.Write(uint.MaxValue);
            bw.Write("안녕하세요.");
            bw.Write(double.MaxValue);

            bw.Close();

            BinaryReader br = new BinaryReader(new FileStream("a.dat", FileMode.Open));

            Console.WriteLine($"File size : {br.BaseStream.Length} bytes");
            Console.WriteLine($"{br.ReadInt32()}");
            Console.WriteLine($"{br.ReadString()}");
            Console.WriteLine($"{br.ReadUInt32()}");
            Console.WriteLine($"{br.ReadString()}");
            Console.WriteLine($"{br.ReadDouble()}");

            br.Close();

            return 0;
        }
    }
}


/* 결과

File size : 46 bytes
2147483647
Hello World!
4294967295
안녕하세요.
1.79769313486232E+308

*/

FileStream만으로 데이터를 기록할 때는 BitConverter를 이용해서 각 데이터를 바이트 단위로 나눠 따로 저정했다. 그런데 BinaryWriter는 각 데이터 타입을 알아서 바이트 단위로 나눠 저장해줬음을 알 수 있다.

문자열을 저장할 때는 문자열의 길이를 저장할 데이터의 가장 첫 번째 바이트에 저장해두고 그 뒤부터 문자열 데이터를 저장하고 있다.

Comments