using System;
using System.IO; // 파일 입출력을 위한 네임스페이스
using FS = System.IO.FileStream; // FileStream 클래스에 FS라는 별칭을 지정.
// System.IO.FileStream과 같이 긴 이름의 클래스를,
// FS라는 간단한 별칭으로 사용할 수 있도록 합니다.
/*
using 선언:
스트림 열기, 기록하기, 닫기 과정에서 프로그래머가 가장 잘 놓치는 부분이 '스트림 닫기' 과정입니다.
파일을 다룰 때, 파일을 열어서 실컷 이용한 다음 자원을 해제하지 않는 것이 프로그래머가 흔히 하는 실수입니다.
using 선언을 통해 생성도니 객체는, 코드 블록이 끝나면서 outStream.Dispose() 메서드를 호출하여,
자동으로 '스트림 닫기'가 이루어지도록 합니다.
using 선언은 Stream 객체뿐 아니라 IDispose를 상속해서 Dispose() 메서드를 구현하는 모든 객체에 대해 사용할 수 있습니다.
using은 네임스페이스를 참조하기 위해서도 사용하지만,
파일이나 소켓을 비롯한 자원을 다룰 때도 요긴합니다.
*/
// System.IO 네임스페이스의 FileStream 클래스와 BitConverter 클래스를 사용하여
// long 형식의 데이터를 파일에 쓰고 읽는 방법.
// using 문을 사용하여 FileStream 객체를 사용한 후 자동으로 닫도록 만듦.
namespace UsingDeclaration
{
class MainApp
{
static void Main(string[] args)
{
long someValue = 0x123456789ABCDEF0; // long 형식의 someValue 변수 선언 및 16진수 값으로 초기화
Console.WriteLine("{0,-1} : 0x{1:X16}", "Original Data", someValue); // someValue 값을 16진수 형식으로 출력
// 1) 파일 스트림 열기
using (Stream outStream = new FS("a.dat", FileMode.Create)) // "a.dat" 파일을 쓰기 모드로 열거나 생성,
// using 구문 사용
{
// 2) someValue(long 형식)을 byte 배열로 변환
byte[] wBytes = BitConverter.GetBytes(someValue); // someValue 값을 바이트 배열로 변환
Console.Write("{0,-13} : ", "Byte array"); // "Byte array" 출력
foreach (byte b in wBytes) // wBytes 배열의 각 바이트를 16진수 형식으로 출력
Console.Write("{0:X2} ", b);
Console.WriteLine();
// 3) 변환한 byte 배열을 파일 스트림을 통해 파일에 기록
outStream.Write(wBytes, 0, wBytes.Length); // wBytes 배열의 내용을 outStream에 씀
} // using 구문 종료 시 outStream 자동으로 닫힘
using Stream inStream = new FS("a.dat", FileMode.Open); // "a.dat" 파일을 읽기 모드로 열고 using 구문 사용
byte[] rbytes = new byte[8]; // 읽어온 데이터를 저장할 바이트 배열 rbytes 선언
int i = 0;
while (inStream.Position < inStream.Length) // inStream의 현재 위치가 파일의 끝에 도달할 때까지 반복
rbytes[i++] = (byte)inStream.ReadByte(); // inStream에서 한 바이트씩 읽어와 rbytes 배열에 저장
long readValue = BitConverter.ToInt64(rbytes, 0); // rbytes 배열을 long 형식으로 변환
Console.WriteLine("{0,-13} : 0x{1:X16} ", "Read Data", readValue); // readValue 값을 16진수 형식으로 출력
} // using 구문 종료 시 inStream 자동으로 닫힘
}
}
/*
출력 결과
Original Data : 0x123456789ABCDEF0
Byte array : F0 DE BC 9A 78 56 34 12
Read Data : 0x123456789ABCDEF0
*/
코드 설명
using System;
using System.IO; // 파일 입출력을 위한 네임스페이스
using FS = System.IO.FileStream; // FileStream 클래스에 FS라는 별칭을 지정
namespace UsingDeclaration
{
class MainApp
{
static void Main(string[] args)
{
long someValue = 0x123456789ABCDEF0; // long 형식의 someValue 변수 선언 및 16진수 값으로 초기화
Console.WriteLine("{0,-1} : 0x{1:X16}", "Original Data", someValue); // someValue 값을 16진수 형식으로 출력
using (Stream outStream = new FS("a.dat", FileMode.Create)) // "a.dat" 파일을 쓰기 모드로 열거나 생성, using 구문 사용
{
byte[] wBytes = BitConverter.GetBytes(someValue); // someValue 값을 바이트 배열로 변환
Console.Write("{0,-13} : ", "Byte array"); // "Byte array" 출력
foreach (byte b in wBytes) // wBytes 배열의 각 바이트를 16진수 형식으로 출력
Console.Write("{0:X2} ", b);
Console.WriteLine();
outStream.Write(wBytes, 0, wBytes.Length); // wBytes 배열의 내용을 outStream에 씀
} // using 구문 종료 시 outStream 자동으로 닫힘
using Stream inStream = new FS("a.dat", FileMode.Open); // "a.dat" 파일을 읽기 모드로 열고 using 구문 사용
byte[] rbytes = new byte[8]; // 읽어온 데이터를 저장할 바이트 배열 rbytes 선언
int i = 0;
while (inStream.Position < inStream.Length) // inStream의 현재 위치가 파일의 끝에 도달할 때까지 반복
rbytes[i++] = (byte)inStream.ReadByte(); // inStream에서 한 바이트씩 읽어와 rbytes 배열에 저장
long readValue = BitConverter.ToInt64(rbytes, 0); // rbytes 배열을 long 형식으로 변환
Console.WriteLine("{0,-13} : 0x{1:X16} ", "Read Data", readValue); // readValue 값을 16진수 형식으로 출력
// using 구문 종료 시 inStream 자동으로 닫힘
}
}
}
코드 설명
이 C# 코드는 System.IO 네임스페이스의 FileStream 클래스와 BitConverter 클래스를 사용하여 long 형식의 데이터를 파일에 쓰고 읽는 예제입니다. using 문을 사용하여 FileStream 객체를 사용한 후 자동으로 닫도록 하였습니다.
using System;: Console 클래스를 사용하기 위해 System 네임스페이스를 사용합니다.using System.IO;: 파일 입출력을 위한 FileStream 클래스를 사용하기 위해 System.IO 네임스페이스를 사용합니다.using FS = System.IO.FileStream;: FileStream 클래스에 FS라는 별칭을 지정하여 코드를 간결하게 만듭니다.long someValue = 0x123456789ABCDEF0;: long 형식의 someValue 변수를 선언하고 16진수 값으로 초기화합니다.Console.WriteLine("{0,-1} : 0x{1:X16}", "Original Data", someValue);: someValue 값을 16진수 형식으로 출력합니다.using (Stream outStream = new FS("a.dat", FileMode.Create)): "a.dat" 파일을 쓰기 모드(FileMode.Create)로 열거나 생성합니다. using 문을 사용하면 outStream 객체를 사용한 후 자동으로 Close() 메서드가 호출되어 스트림이 닫힙니다.byte[] wBytes = BitConverter.GetBytes(someValue);: someValue 값을 바이트 배열로 변환합니다.Console.Write("{0,-13} : ", "Byte array");: "Byte array"를 출력합니다.foreach (byte b in wBytes) Console.Write("{0:X2} ", b);: wBytes 배열의 각 바이트를 16진수 형식으로 출력합니다.outStream.Write(wBytes, 0, wBytes.Length);: wBytes 배열의 내용을 outStream에 씁니다.using Stream inStream = new FS("a.dat", FileMode.Open);: "a.dat" 파일을 읽기 모드(FileMode.Open)로 열고 using 문을 사용합니다.byte[] rbytes = new byte[8];: 읽어온 데이터를 저장할 바이트 배열 rbytes를 선언합니다.while (inStream.Position < inStream.Length): inStream의 현재 위치가 파일의 끝에 도달할 때까지 반복합니다.rbytes[i++] = (byte)inStream.ReadByte();: inStream에서 한 바이트씩 읽어와 rbytes 배열에 저장합니다.long readValue = BitConverter.ToInt64(rbytes, 0);: rbytes 배열을 long 형식으로 변환합니다.Console.WriteLine("{0,-13} : 0x{1:X16} ", "Read Data", readValue);: readValue 값을 16진수 형식으로 출력합니다.출력 결과
Original Data : 0x123456789ABCDEF0
Byte array : F0 DE BC 9A 78 56 34 12
Read Data : 0x123456789ABCDEF0
using 문
using 문은 IDisposable 인터페이스를 구현하는 객체를 사용할 때, 객체 사용 후 자동으로 리소스를 해제해주는 기능을 제공합니다.using 문을 사용하면 try-finally 블록을 사용하지 않고도 리소스를 안전하게 해제할 수 있습니다.using 문은 FileStream과 같이 파일, 네트워크 연결, 데이터베이스 연결 등 외부 리소스를 사용하는 객체에 유용합니다.이 코드는 using 문을 사용하여 FileStream 객체를 사용한 후 자동으로 닫는 방법을 보여줍니다.
아니요, outStream은 파일 자체가 아니라, 파일을 쓰기 위한 스트림입니다.
스트림은 데이터의 흐름을 나타내는 추상적인 개념으로, 파일, 네트워크, 메모리 등 다양한 곳에서 데이터를 읽고 쓸 수 있도록 해줍니다.
FileStream은 파일을 읽고 쓰기 위한 스트림입니다. 즉, outStream은 "a.dat" 파일을 쓰기 위한 스트림 객체입니다.
outStream을 사용하여 파일에 데이터를 쓰려면, outStream.Write() 메서드를 사용합니다.
byte[] data = { 0x01, 0x02, 0x03 };
outStream.Write(data, 0, data.Length); // data 배열의 내용을 outStream에 씁니다.
이 코드는 data 배열의 내용을 outStream에 쓰고, outStream은 이 데이터를 "a.dat" 파일에 씁니다.
따라서 outStream은 파일 자체가 아니라, 파일을 쓰기 위한 스트림입니다.
outStream.Write(wBytes, 0, wBytes.Length); 이 코드는 wBytes 배열의 내용을 outStream에 쓰는 것이 맞지만, 좀 더 정확하게 설명하면 wBytes 배열의 내용을 outStream이라는 스트림에 쓰는 것이라고 할 수 있습니다.
outStream은 FileStream 객체로, 파일을 쓰기 위한 스트림입니다. 즉, outStream은 파일 자체가 아니라, 파일에 데이터를 쓰기 위한 통로 역할을 합니다.
outStream.Write(wBytes, 0, wBytes.Length);는 wBytes 배열의 내용을 outStream에 쓰고, outStream은 이 데이터를 "a.dat" 파일에 쓰게 됩니다.
따라서 "wBytes 배열의 내용을 outStream에 씀"이라는 설명은, "wBytes 배열의 내용을 outStream이라는 스트림에 써서 a.dat 파일에 저장합니다" 와 같이 좀 더 자세하게 설명할 수 있다.