using System;
using System.IO; // 파일 입출력을 위한 네임스페이스
/*
BinaryWriter 클래스, BinaryReader 클래스:
BinaryWriter 클래스는 스트림에 이진 데이터(Binary Data)를 기록하기 위한 목적으로,
그리고 BinaryReader 클래스는 스트림으로부터 이진 데이터를 읽어들이기 위한 목적으로 만들어진 클래스입니다.
BinaryWriter 클래스, BinaryReader 클래스 나온 배경?
FileStream 클래스는 파일 처리를 위한 모든 것을 갖고 있지만,
데이터를 저장할 때, 반드시 byte 형식 또는 byte의 배열 형식으로 변환해야 한다는 번거로움이 있습니다.
따라서 .NET은 이런 불편함을 해소하기 위해 이 두 클래스를 만든 것입니다.
BinaryWriter와 BinaryReader 클래스는 결국 파일 처리의 도우미 역할을 할 뿐이기 때문에,
이 클래스들을 이용하려면 Stream으로부터 파생된 클래스의 인스턴스가 있어야 합니다.
(예를 들어 BinaryWriter와 FileStream을 함께 사용하면
BinaryWriter의 이진 데이터 쓰기 기능을 파일 기록에 사용할 수 있고,
NetworkStream과 함꼐 사용한다면 네트워크로 이진 데이터를 내보낼 수 있습니다.)
FileStream만으로 데이터를 기록할 때는 BitConverter를 이용해서 각 데이터를 바이트 단위로 나눠 따로 저장했는데,
BinaryWriter는 각 데이터 타입을 '알아서' 바이트 단위로 저장해줍니다.
*/
// BinaryWriter와 BinaryReader를 사용하여 다양한 데이터 타입의 값을 파일에 쓰고 읽는 프로그램
namespace BinaryFile
{
class MainApp
{
static void Main(string[] args)
{
using (BinaryWriter bw = new BinaryWriter(new FileStream("a.dat", FileMode.Create)))
// "a.dat" 파일을 생성하고, BinaryWriter 객체 bw를 사용하여 파일에 쓸 수 있도록 합니다.
// using 문을 사용하였으므로, bw 객체를 사용한 후 자동으로 Close() 메서드가 호출되어 파일이 닫힙니다.
{
bw.Write(int.MaxValue); // int 타입의 최댓값을 파일에 씀
bw.Write("Good morning!"); // 문자열 "Good morning!"을 파일에 씀
bw.Write(uint.MaxValue); // uint 타입의 최댓값을 파일에 씀
bw.Write("안녕하세요!"); // 문자열 "안녕하세요!"를 파일에 씀
bw.Write(double.MaxValue); // double 타입의 최댓값을 파일에 씀
} // using 블록 종료 시 bw.Close() 자동 호출
// bw 스트림은 여기서 한 번 닫힙니다,
// 이렇게 닫지 않고 이후에 같은 스타일의 using 선언을 이용했다면,
// a.dat가 열려 있는 상태에서 같은 파일을 다시 열려고 하는 상황이 발생합니다.
using BinaryReader br = new BinaryReader(new FileStream("a.dat", FileMode.Open));
// "a.dat" 파일을 열고, BinaryReader로 연결
// 1. `new FileStream("a.dat", FileMode.Open)`: "a.dat" 파일을 읽기 모드(`FileMode.Open`)로 엽니다.
// `FileStream`은 파일을 읽고 쓰기 위한 스트림을 나타냅니다.
// 즉, 파일과 프로그램 사이에 데이터가 흐를 수 있는 통로를 만드는 것이죠.
// 2. `new BinaryReader(...)`: `BinaryReader` 객체를 생성합니다.
// `BinaryReader`는 파일 스트림에서 데이터를 읽어오는 데 사용되는 클래스입니다.
// 3. `BinaryReader br = ...`: 생성된 `BinaryReader` 객체를 `br`이라는 변수에 저장합니다.
// 이제 `br` 변수를 사용하여 파일에서 데이터를 읽어올 수 있습니다.
// 4. `using`: `using` 문은 `BinaryReader` 객체를 사용한 후 자동으로 `Close()` 메서드를 호출하여 파일을 닫습니다.
// 이는 파일을 안전하게 닫고 리소스를 해제하는 데 중요합니다.
Console.WriteLine($"File size : {br.BaseStream.Length} bytes"); // 파일 크기 출력
Console.WriteLine($"{br.ReadInt32()}"); // 파일에서 int 값 읽어서 출력
Console.WriteLine($"{br.ReadString()}"); // 파일에서 문자열 읽어서 출력
Console.WriteLine($"{br.ReadUInt32()}"); // 파일에서 uint 값 읽어서 출력
Console.WriteLine($"{br.ReadString()}"); // 파일에서 문자열 읽어서 출력
Console.WriteLine($"{br.ReadDouble()}"); // 파일에서 double 값 읽어서 출력
} // using 블록 종료 시 br.Close() 자동 호출
}
}
/*
출력 결과
File size : 47 bytes
2147483647
Good morning!
4294967295
안녕하세요!
1.7976931348623157E+308
*/
코드 설명
using System;
using System.IO; // 파일 입출력을 위한 네임스페이스
namespace BinaryFile
{
class MainApp
{
static void Main(string[] args)
{
using (BinaryWriter bw = new BinaryWriter(new FileStream("a.dat", FileMode.Create))) // "a.dat" 파일을 생성하고 BinaryWriter로 연결
{
bw.Write(int.MaxValue); // int 최댓값을 파일에 씀
bw.Write("Good morning!"); // 문자열 "Good morning!"을 파일에 씀
bw.Write(uint.MaxValue); // uint 최댓값을 파일에 씀
bw.Write("안녕하세요!"); // 문자열 "안녕하세요!"를 파일에 씀
bw.Write(double.MaxValue); // double 최댓값을 파일에 씀
} // using 블록 종료 시 bw.Close() 자동 호출
using BinaryReader br = new BinaryReader(new FileStream("a.dat", FileMode.Open)); // "a.dat" 파일을 열고 BinaryReader로 연결
Console.WriteLine($"File size : {br.BaseStream.Length} bytes"); // 파일 크기 출력
Console.WriteLine($"{br.ReadInt32()}"); // 파일에서 int 값 읽어서 출력
Console.WriteLine($"{br.ReadString()}"); // 파일에서 문자열 읽어서 출력
Console.WriteLine($"{br.ReadUInt32()}"); // 파일에서 uint 값 읽어서 출력
Console.WriteLine($"{br.ReadString()}"); // 파일에서 문자열 읽어서 출력
Console.WriteLine($"{br.ReadDouble()}"); // 파일에서 double 값 읽어서 출력
// using 블록 종료 시 br.Close() 자동 호출
}
}
}
코드 설명
이 C# 코드는 BinaryWriter와 BinaryReader를 사용하여 다양한 데이터 타입의 값을 파일에 쓰고 읽는 예제입니다.
BinaryWriter: 이진 형식으로 데이터를 파일에 쓰는 클래스입니다.BinaryReader: 이진 형식으로 파일에서 데이터를 읽는 클래스입니다.Main 메서드
using (BinaryWriter bw = new BinaryWriter(new FileStream("a.dat", FileMode.Create))): "a.dat" 파일을 생성하고 BinaryWriter 객체 bw를 사용하여 파일에 쓸 수 있도록 합니다. using 문을 사용하면 bw 객체를 사용한 후 자동으로 Close() 메서드가 호출되어 파일이 닫힙니다.bw.Write(int.MaxValue);: int 타입의 최댓값을 파일에 씁니다.bw.Write("Good morning!");: 문자열 "Good morning!"을 파일에 씁니다.bw.Write(uint.MaxValue);: uint 타입의 최댓값을 파일에 씁니다.bw.Write("안녕하세요!");: 문자열 "안녕하세요!"를 파일에 씁니다.bw.Write(double.MaxValue);: double 타입의 최댓값을 파일에 씁니다.using BinaryReader br = new BinaryReader(new FileStream("a.dat", FileMode.Open));: "a.dat" 파일을 열고 BinaryReader 객체 br를 사용하여 파일에서 읽을 수 있도록 합니다. using 문을 사용하면 br 객체를 사용한 후 자동으로 Close() 메서드가 호출되어 파일이 닫힙니다.Console.WriteLine($"File size : {br.BaseStream.Length} bytes");: 파일의 크기를 바이트 단위로 출력합니다.Console.WriteLine($"{br.ReadInt32()}");: 파일에서 int 값을 읽어서 출력합니다.Console.WriteLine($"{br.ReadString()}");: 파일에서 문자열을 읽어서 출력합니다.Console.WriteLine($"{br.ReadUInt32()}");: 파일에서 uint 값을 읽어서 출력합니다.Console.WriteLine($"{br.ReadString()}");: 파일에서 문자열을 읽어서 출력합니다.Console.WriteLine($"{br.ReadDouble()}");: 파일에서 double 값을 읽어서 출력합니다.출력 결과
File size : 52 bytes
2147483647
Good morning!
4294967295
안녕하세요!
1.7976931348623157E+308
using (BinaryWriter bw = new BinaryWriter(new FileStream("a.dat", FileMode.Create)))
using (BinaryWriter bw = new BinaryWriter(new FileStream("a.dat", FileMode.Create))) 이 부분은 "a.dat"라는 이름의 파일을 생성하고, 이 파일에 이진 데이터를 쓸 수 있도록 BinaryWriter 객체를 연결하는 코드입니다.
좀 더 자세히 설명하면,
new FileStream("a.dat", FileMode.Create): 먼저 FileStream 객체를 생성합니다.
"a.dat"는 생성할 파일의 이름입니다. FileMode.Create는 파일이 이미 존재하면 덮어쓰고, 존재하지 않으면 새로 생성하는 모드입니다. FileStream 객체는 파일을 읽고 쓰기 위한 스트림을 나타냅니다.new BinaryWriter(...): BinaryWriter 객체를 생성합니다.
FileStream 객체를 전달합니다. BinaryWriter는 스트림에 기본 데이터 타입(int, long, string 등)의 값을 이진 형식으로 쓰는 기능을 제공합니다.using (...): using 문은 BinaryWriter 객체를 사용한 후 자동으로 Close() 메서드를 호출하여 파일을 닫습니다. 이는 파일을 안전하게 닫고 리소스를 해제하는 데 중요합니다.
"연결한다"는 의미
"연결한다"는 것은 BinaryWriter 객체가 FileStream 객체를 통해 "a.dat" 파일에 접근할 수 있도록 설정하는 것을 의미합니다. 즉, BinaryWriter 객체는 FileStream 객체를 통해 파일에 데이터를 쓸 수 있습니다.
예시
bw.Write(10); // 정수 10을 파일에 씀
bw.Write("Hello"); // 문자열 "Hello"를 파일에 씀
이 코드는 BinaryWriter 객체 bw를 사용하여 정수 10과 문자열 "Hello"를 "a.dat" 파일에 씁니다.
이처럼 BinaryWriter 객체는 FileStream 객체를 통해 파일에 연결되어 데이터를 쓸 수 있습니다.
using BinaryReader br = new BinaryReader(new FileStream("a.dat", FileMode.Open)); // "a.dat" 파일을 열고 BinaryReader로 연결
using BinaryReader br = new BinaryReader(new FileStream("a.dat", FileMode.Open)); 이 코드는 "a.dat"라는 파일을 읽기 모드로 열고, 그 파일에서 데이터를 읽어올 수 있는 BinaryReader 객체를 생성하는 역할을 합니다.
좀 더 자세히 설명하면,
new FileStream("a.dat", FileMode.Open): "a.dat" 파일을 읽기 모드(FileMode.Open)로 엽니다. FileStream은 파일을 읽고 쓰기 위한 스트림을 나타냅니다. 즉, 파일과 프로그램 사이에 데이터가 흐를 수 있는 통로를 만드는 것이죠.
new BinaryReader(...): BinaryReader 객체를 생성합니다. BinaryReader는 파일 스트림에서 데이터를 읽어오는 데 사용되는 클래스입니다.
BinaryReader br = ...: 생성된 BinaryReader 객체를 br이라는 변수에 저장합니다. 이제 br 변수를 사용하여 파일에서 데이터를 읽어올 수 있습니다.
using: using 문은 BinaryReader 객체를 사용한 후 자동으로 Close() 메서드를 호출하여 파일을 닫습니다. 이는 파일을 안전하게 닫고 리소스를 해제하는 데 중요합니다.
"연결한다"는 표현
"연결한다"는 표현은 BinaryReader 객체가 FileStream 객체를 통해 파일과 연결되어 파일에서 데이터를 읽어올 수 있는 상태가 되었다는 것을 의미합니다. 마치 전화선을 연결하여 두 사람이 통화할 수 있게 되는 것과 비슷합니다. BinaryReader는 파일에서 데이터를 읽어오는 역할을 하고, FileStream은 파일과 BinaryReader 사이의 통로 역할을 합니다.
BinaryReader의 주요 메서드
ReadInt32(): 파일에서 4바이트 정수를 읽습니다.ReadString(): 파일에서 문자열을 읽습니다.ReadUInt32(): 파일에서 4바이트 부호 없는 정수를 읽습니다.ReadDouble(): 파일에서 8바이트 실수를 읽습니다.이러한 메서드를 사용하여 파일에서 다양한 타입의 데이터를 읽어올 수 있습니다.