Hello, Android!
버퍼와 스트림 본문
파일 읽기 쓰기를 할때에는 버퍼, 스트림 두 가지 방식을 사용한다
노드에서는 파일을 읽을 때 메모리에 파일 크기만큼의 공간을 준비한 뒤
파일 데이터를 메모리에 저장하여 조작이 가능하며, 메모리에 저장된 데이터가 버퍼 이다
그리고 노드에서는 Buffer를 사용하여 버퍼를 직접 조작할수 있다
Buffer에는 다양한 메서드를 지원한다
- from : 문자열을 버퍼로 바꿔준다. length를 사용하면 버퍼의 크기를 확인할수 있다
- concat : 배열의 버퍼들을 하나로 합쳐준다
- alloc : 매개변수의 크기만큼의 빈 버퍼를 만든다
- toString : 버퍼를 문자열로 바꿔준다
이전의 파일 입출력에서 파일을 읽을때 readFile을 사용하였는데 함수의 결과가 버퍼로 나와
toString()으로 다시 문자열로 만들었다
readFile에서 20mb의 파일을 읽는다고 하면 해당 크기 만큼의 버퍼를 만들어야하며
같은 작업을 동시에 여러개를 하면 그만큼 많은 메모리가 필요하다
하지만 스트림을 사용하게 되면 1mb 크기의 버퍼를 만들어 필요한 크기만큼 반복하여 전송한다
즉 1mb 버퍼를 20번 나눠서 전송하여 메모리를 절약할수 있다
노드에서 스트림은 createReadStream, createWriteStream을 사용한다
createWriteStream함수는 첫번째 매개변수로 작성할 파일 경로 두번째 매개변수는 옵션을 받는다
write()함수에 작성할 데이터를 넣으며, end함수로 종료를 알린다
종료된 이후에는 finish 이벤트가 발생한다
createReadStream 함수는 첫번째 매개변수로 읽을 파일의 경로, 두번째 매개변수는 옵션을 넣는다
이번에 사용한 highWaterMark 옵션은 버퍼의 크기를 지정하는데 기본값은 64kb이다 위의 경우는 20B가 된다
주로 이벤트 리스너를 사용하며 파일 읽기가 시작되면 data 이벤트가 발생하고 파일을 다 읽으면 end 이벤트가 호출된다
리눅스에서 사용하던 파이프와 유사한 pipe가 있다
기능도 비슷하여 특정 스트림을 실행한 뒤 결과를 받아 다른 스트림으로 넘기는 것이다
사용법은 간단하다 스트림 뒤에 .pipe를 붙인 뒤 매개변수로 다음에 실행할 스트림을 넣어주면 된다
예제에서는 하나의 파이프만 사용하였지만 연속해서 여러 스트림을 연결할수도 있다