우리는 C#에서 이진 데이터(바이너리 데이터)를 읽고 쓰기 위해 BinaryWriter와 BinaryReader를 사용할 수 있다.
이 클래스들은 System.IO 네임스페이스에 선언되어 있으므로 사용하기 위해서는 System.IO를 using 해줘야 한다.
- BinaryWriter : 스트림에 이진 데이터(Binary Data)를 기록하기 위한 목적으로 만들어진 클래스
- BinaryReader : 스트림으로부터 이진 데이터를 읽어들이기 위한 목적으로 만들어진 클래스
Bin 파일이란?
Binary File (바이너리 파일)이라고 부르며, 컴퓨터가 사용하는 이진 텍스트 파일이다. 이진 파일 형식의 문자열이 포함되어 있으며 완전한 텍스트 파일이며, 여러 가지 형태로 사용이 가능하다. 간단하게 말해 컴퓨터가 이해할 수 있는 텍스트 파일이라고 보면 된다.
Bin 파일을 쓰는 이유?
- 데이터를 빠르게 처리할 수 있다. 이진수 체계는 0과 1 두 가지 값만으로 이루어져 있어 다른 진수 체계에 비해 데이터 처리 속도가 빠르다.
- 사람이 직접 읽을 수 없어서 사용자에게 노출금지시킬 수 있다.
(C# - 유니티예제) BinaryWriter : Bin 파일 쓰기
일단 필요한 아이템 데이터를 구조체로 만들어 놓는다.
1
2
3
4
5
6
7
|
private struct ItemData
{
public int Id;
public string Name;
public float Recovery;
public float Ratio;
}
|
cs |
바이너리 파일을 쓰려면 BinaryWriter을 사용해야 한다.
StreamWriter와 다르게 파일 스트림을 별도로 만들어야한다.
파일 스트림이란?
인스턴스를 생성하여 메모리에 할당하여 사용하는 클래스. 해당 클래스의 인스턴스를 생성하면, 파일과 관련된 스트림이 생성되며, 파일과 직접적으로 접근하여 데이터를 주고받을 수 있다. 생성자에는 (1)파일경로, 파일명, 파일 확장자를 설정할 수 있고, (2)파일 모드와 (3)파일 권한을 설정할 수 있다.
FileStream (파일을 순서대로 내보내는 것)
통로를 열음 : FileStream stream = new FileStream((1)path, (2)FileMode.Open);
Bin파일 쓰기(저장) 함수를 작성해준다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
private void Save_BinFile()
{
string directory = Application.dataPath + "/UnitTests/Test_BinFile/";
string path = EditorUtility.SaveFilePanel("Save CsvFile", directory, "Test", "bin");
if (path.Length < 1)
return;
ItemData[] datas = new ItemData[4];
//0
{
datas[0].Id = 0x00000001;
datas[0].Name = "Position";
datas[0].Recovery = 20.0f;
datas[0].Ratio = 0.5f;
}
//1
{
datas[1].Id = 0x00000002;
datas[1].Name = "Big Position";
datas[1].Recovery = 50.0f;
datas[1].Ratio = 0.8f;
}
//2
{
datas[2].Id = 0x00000003;
datas[2].Name = "Poison Position";
datas[2].Recovery = -10.0f;
datas[2].Ratio = 1.0f;
}
//3
{
datas[3].Id = 0x00000004;
datas[3].Name = "Mana Position";
datas[3].Recovery = 60.0f;
datas[3].Ratio = -1.0f;
}
FileStream stream = new FileStream(path, FileMode.Create); // 파일 스트림을 하나 만들어줘야 함
{
BinaryWriter writer = new BinaryWriter(stream);
{
foreach (ItemData data in datas)
{
writer.Write(data.Id);
writer.Write(data.Name);
writer.Write(data.Recovery);
writer.Write(data.Ratio);
}
}
writer.Close();
}
stream.Close();
}
|
cs |
Bin파일을 생성한 다음, 메모장으로 끌어다 보면
이렇게 문자가 깨지면서 사용자가 알아볼 수 없도록 나타난다.
(C# - 유니티예제) Binary Reader : Bin 파일 읽기
Bin파일 읽기 함수를 작성해준다.
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
32
33
|
private void Read_BinFile()
{
string directory = Application.dataPath + "/UnitTests/Test_BinFile/";
string path = EditorUtility.OpenFilePanel("Read BinFile", directory, "bin");
if (path.Length < 1)
return;
List<ItemData> dataList = new List<ItemData>();
FileStream stream = new FileStream(path, FileMode.Open);
{
BinaryReader reader = new BinaryReader(stream);
{
while(reader.BaseStream.Position != reader.BaseStream.Length)
{
ItemData data = new ItemData();
data.Id = reader.ReadInt32();
data.Name = reader.ReadString();
data.Recovery = reader.ReadSingle();
data.Ratio = reader.ReadSingle();
dataList.Add(data);
}
}
reader.Close();
}
stream.Close();
foreach(ItemData data in dataList)
print($"{data.Id}, {data.Name}, {data.Recovery}, {data.Ratio}");
}
|
cs |
출처 및 참고: 강의 짱잘하시는 울 유니티 선생님 수업
HyunZzang의 프로그래밍 공간 / 함께 공부해요!!
도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다 :)