Stream Architecture
- 파일은 보통 ‘단방향’으로 읽고 쓰고를 진행한다.
- 대표적 파일 입출력
- Stream adapters, Decorator streams, Backing store streams는 전부 클래스 이름이다.
- Stream adapters : 텍스트 데이터, 바이너리 데이터, Json 데이터 등을 읽고 쓰는 작업을 담당한다.
- Decorator streams : 데이터를 감싸는 기능
- GZipStream : 압축 기능이 모여져있는 클래스다.
- 압축을 다루는 스트림에 입력과 출력을 하는것과 같다.
- Backing store streams : 특정 하드웨어와 매칭하고, 데이터를 주고받는 기능
- 주로 FileStream과 MemoryStream을 사용한다.
- FileStream : 파일 읽고 쓰기 등을 가능하게 하는 기능이 모여져있는 클래스다.
- 파일 읽고 쓰기는 데이터 ‘비트’들을 주고 받는것이다.
- 이 이외에도 여러 작업을 담당하는 기능들이 있다.
- 순차적으로 데이터를 읽고 씀
- stream처럼 단방향으로 데이터가 흐르는것을 생각하면 된다.
- 세부 구현 노출 X, 표준 메소드 세트로 읽기, 쓰기, 위치 조정
- 한 바이트 또는 임의의 바이트 블럭 단위로 데이터를 순서대로 읽고 씀
유니티 파일 입출력
Using Streams
- Stream s : 추상 클래스
- using 구문 : 예외처리와 관계가 있다.
- 에외가 나거나 말거나 FileStream의 dispose 메서드를 호출한다.
- 예외가 나서 중지된다면 파일 열어놓은것을 처리해야한다.
- dispose 메서드에 그러한 작업을 처리하는 구문이 담겨져있다.
- FileSteam(파일 경로 - 상대 경로, 파일 모드)
- 상대 경로는 항상 기준이 필요하다.
- 일반적으로 어플리케이션의 기준은 실행 파일이 기준이 된다.
- C++때는 실행파일 기본경로와 다른 기본경로가 달랐지만, C#은 기본 경로가 같아서 신경쓰지 않아도 된다.
- 기본동작이 바이너리 데이터를 읽고 쓰는것으로 되어있다.
- 따라서, 기본이 ‘바이트 단위’로 읽고 쓰기를 진행한다.
- Write(바이트 배열, 시작 인덱스, 배열 요소 갯수) : 경로의 파일에 처음부터 요소 갯수만큼 쓰겠다는 것이다.
- Read(바이트 배열, 카운트, 요소 갯수) : 바이트 배열을 카운트부터 요소 갯수만큼 읽어오는 것이다.
- 즉, 실재로 쓰여진 요소를 읽어오는것이다.
- 왜 마지막의 출력은 0인 것인가? ; 하나씩 읽어 5를 반환하니 현재 위치가 마지막 요소 위치로 저장되었기에 0의 자리는 마지막 요소의 위치가 되는 것이다.
- WriteByte : 파일에 바이트형 정수를 작성하는 함수
- FileMode가 Create이니 실재로 파일이 생성된다.
- 확장자는 txt이지만 FileStream은 ‘바이너리 데이터’로 읽고 쓰기가 진행되기에 저장되는 데이터는 바이너리 파일로 저장된다.
- byte[] data = new byte[1000] : 1000개의 버퍼를 생성하는 것이다.
MemoryStream
FileStream sourceStream;
var ms = new MemoryStream();
sourceStream.CopyTo (ms);
- 네트워크가 제일 느리다 < 보조기억장치 < cpu 단의 메모리
- FileStream은 보조기억장치와 속도가 맞춰진다.
- 즉, 느리다는 것이다.
- 지금은 네트워크도 빨라져서 속도 차이가 많이 안난다.
- 파일에서 스트리밍하는게 아니라 파일을 올리고 메모리에서 스트리밍하는게 더 속도가 빠르다.
- 세부적인 조작을 메모리 스트림에서 하는것이다.
Path
- 파일경로나 디렉토리 경로를 만드는데 도움이 되는 기능이 모여진 클래스다.
string dir = @"c:\\mydir"; // or /mydir
string file = "myfile.txt";
string path = @"c:\\mydir\\myfile.txt"; // or /mydir/myfile.txt
Directory.SetCurrentDirectory (@"k:\\demo"); // or /demo
- SetCurrentDirectory : 현재 경로 설정 함수다.
Directory.GetCurrentDirectory() // k:\\demo\\ or /demo
Path.IsPathRooted (file) // False
Path.IsPathRooted (path) // True
Path.GetPathRoot (path) // c:\\ or /
Path.GetDirectoryName (path) // c:\\mydir or /mydir
Path.GetFileName (path) // myfile.txt
Path.GetFullPath (file) // k:\\demo\\myfile.txt or /demo/myfile.txt
Path.Combine (dir, file) // c:\\mydir\\myfile.txt or /mydir/myfile.txt
- GetCurrentDirectory : 현재 경로 반환
- IsPathRooted : 최상위 경로인지 확인