스트림(Stream)
       - 파일 읽기, 쓰기 : 텍스트 파일
       - 프로그램을 기준으로 내부에서 외부, 외부에서 내부로 데이터가 이동될때 데이터의 단위
       - 데이터 흐름
       - C#에서의 모든 입출력 단위
인코딩
       - 문자 코드를 0과 1의 바이너리값을 가지는 연속된 비트 형태로 매핑시키는 작업
       - 디코딩 : 인코딩
반대작업, 복원화
       - ASCII : 7비트 사용, 총 128문자 표현
       - ISO-8859-1 : 8비트 사용, 서유럽 문자 집합,
총 256문자 표현
       - KS C 5601 : 한국 공업 표준, 2바이트 완성형 한글 표현, ASCII 제외
       - EUC-KR : ASCII 문자코드 1바이트, 한글 2바이트
       - Unicode : 2바이트 문자 코드 체계
       - UTF-8 : ASCII 문자코드 1바이트, 다른
문자 2바이트 이상(한글
3바이트), 닷넷 기본 인코딩 방식
       - UTF-16 : 모든 문자코드 2바이트 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;//
namespace ConsoleEx
{
       //Ex117_Stream.cs
       class Ex117_Stream
       {
             static void Main(string[]
args)
             {
                    M1();
             }
             private static void M1()
             {
                    //파일에 쓰기
                    //1. FileInfo 객체 생성하기
                    // - 현재 실행파일과 동일한 폴더의 memo.txt
                    FileInfo file = new
FileInfo(@"D:\김종현\memo.txt");
                    //D:\[01]CSharp\ConsoleEx\bin\Debug\memo.txt
                    //Console.WriteLine(file.FullName);
                    //2. 해당 파일에 읽거나 쓸수있는 스트림 열기
                    // - CreateText()로 만든 StreamWirter는 해당
파일이 없으면 새로 생성함!!
                    // - CreateText()로 만든 StreamWriter는 해당
파일이 있어도 덮어쓰기!!
                    // - AppendText()로 만든 StreamWrite는 해당 파일이
있으면 이어쓰기!!
                    // - AppendText()로 만든 StreamWirter는 해당
파일이 없으면 새로 생성함!!
                    // - 파일 열기
                    //StreamWriter writer =
file.CreateText();
                    StreamWriter writer = file.AppendText();
                    //3. 쓰기
                    // - 모든 입출력은 버퍼를 통해서 작업이 진행
                    //writer.Write();
                    //writer.WriteLine();
                    writer.WriteLine(DateTime.Now.ToString());
                    writer.WriteLine("안녕하세요~ 테스트입니다.");
                    //현재 출력버퍼에 쌓여있는 모든 내용을 실제파일 옮기고.. 버퍼를 비워라
                    //중간에 버퍼가 너무 쌓이면 버퍼를 비우는 용도
                    writer.Flush();
                    Console.ReadLine();
                    writer.WriteLine("추가 기록");
                    //4. 버퍼 -> 파일 옮겨적기
                    // - 파일 닫기
                    writer.Close();
                    //writer.WriteLine("추가 기록");
             }
       }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleEx
{
       //Ex118_Stream.cs
       class Ex118_Stream
       {
             static void Main(string[]
args)
             {
                    //M1();
                    //M2();
                    M3();
             }
             private static void M3()
             {
                    FileInfo file
= new FileInfo(@"D:\김종현\김종현.txt");
                    if (file.Exists)
                    {
                           StreamReader
reader = file.OpenText();
                           //읽은 데이터를 어딘가에 저장 -> 다시읽기
                           //1. 어딘가? -> 메모리 (배열) -> 속도 이득
                           //2. 메모리를 차지함(단점)
                           string
temp = reader.ReadLine();
                           Console.WriteLine(reader.ReadLine());
                           Console.WriteLine(reader.ReadLine());
                           Console.WriteLine(temp);
                           reader.Close();
                           //다시 읽기 용도의 스트림을 생성
                           //1. 메모리 공간을 차지x
                           //2. 비용 발생(무거움)
                           reader = file.OpenText();
                           Console.WriteLine(reader.ReadLine());
                           //요구사항 하나를 다시 읽고 싶음 첫번째라면, 한번
읽었던 라인을 다시 읽고 싶음
                           //결과 불가능
                           //내부적:Stream 텍스트 내용 보다 윗
줄에 책갈피가있다.
                           //readLine 결과 -> 커서가 한칸 라인으로 내려가고
그다음부턴 알어서 한칸씩 내려간다.
                           //없는곳까지 가서 null을 반환한다.
                           //Stream 방식은 전진 방식 밖에 없다. 커서를 다시
위로 올리는건 불가능
                           
                           //★ 반드시 닫아 주도록 한다.
                           reader.Close();
                    }
             }
             {
                    FileInfo file = new
FileInfo(@"D:\김종현\김종현.txt");
                    if (file.Exists)
                    {
                           StreamReader reader = file.OpenText();
                           reader.ReadLine();
                           string
data = reader.ReadToEnd();
                           Console.WriteLine(data);
                    }
             }
             {
                    //읽기 - 파일이 없으면?
                    //1. 파일 객체 생성
                    FileInfo file = new
FileInfo(@"D:\김종현\김종현.txt");
                    if (file.Exists)
                    {
                           //2. 스트림 생성 - 읽기 위한 용도
                           StreamReader reader = file.OpenText();
                           //3. 읽기
                           // - 텍스트파일의 한줄을 읽어서 string 반환
                           //string data =
reader.ReadLine();
                           //Console.WriteLine(data);
                           //data =
reader.ReadLine();//두번째 줄
                           //Console.WriteLine(data);
                           //data =
reader.ReadLine();//세번째 줄
                           //Console.WriteLine(data);
                           //data =
reader.ReadLine();//네번째 줄
                           //Console.WriteLine(data
== null);
                           string
data = "";
                           while
((data = reader.ReadLine()) != null)
                           {
                                 Console.WriteLine(data);
                           }
                    }