안드로이드 개발 질문/답변
(글 수 45,052)
네트워크통신을 하여 서버나 FTP호스팅공간에 있는 어떤 파일을 내려 받는다고 가정하였을때
보면 어떤분들은 바이트 배열로 1024를 잡아서 버퍼로 설정하고
그 버퍼크기만큼 스트림으로 읽어오시는데요.
또 어떤 책에서는 BufferedInputStream을 사용하여 작업하더라구요.
제가 궁금한건 두가지입니다.
첫번째는 배열로 버퍼를 잡아서 읽어오는거랑 버퍼인풋스트림으로 읽어오는것 이 두가지의 차이점이 존재하는지
존재한다면 어떤걸 사용해야 하는지 궁금합니다.
두번째는 버퍼 사이즈입니다.
네트워크 통신에서 버퍼 사이즈를 몇으로 해야 적당한지 궁금합니다.
read() 호출 시... (파라미터 없이)
InputStream은 읽어들인 1바이트를 즉시 리턴해 줍니다. 그리고 다음번 read() 요청시에 다시 1바이트를 스트림에서 읽어서 읽어들인 바이트 수를 리턴해주죠.
그러므로 read()가 호출될 때 마다 IO/Blocking이 발생합니다.
그에 비해 Buffered-의 경우는 내부에 가지고 있는 buffer를 이용해 read(internalBuffer)를 호출합니다. 그 이후 internalBuffer에 있는 데이터에서 1바이트를 읽어서 리턴해주죠. 그러므로 read()가 호출될 때 아직 읽어들이지 않은 internalBuffer의 데이터가 있다면 그 데이터를 받고 모두 다 읽어들였다면 그때 다시 스트림에서 내부버퍼 사이즈만큼의 데이터를 읽어들입니다.
이번엔 read(buffer) 로 호출하는 경우는 어떤지 살펴보죠.
InputStream.read(buffer)는 스트림으로 부터 해당 버퍼사이즈 만큼의 데이터를 읽어서 읽어들인 바이트수를 리턴해줍니다.
그렇다면 BufferedStream.read(buffer) 은 어떨까요. 이녀석은 buffer의 사이즈에 따라서 다르게 동작합니다. 만약 파라미터로 들어온 버퍼의 사이즈가 내부버퍼 사이즈와 같거나 크다면 inputStream.read(buffer)를 호출합니다. 만약 그렇지 않다면 내부 버퍼를 먼저 채우고 채워진 버퍼를 이용해서 파라미터로 넘어온 버퍼에 arraycopy를 수행합니다. (버퍼 사이즈가 작다면 뭔가... 오히려 좀 더 비효율적인것 같죠?)
이래저래 보면 Buffered- 의 mark/reset 기능을 쓰지 않는 이상, Buffered- 나 그냥 inputStream이나 read(buffer array) 호출하게 된다면 성능 상 큰 이슈는 없는 것으로 보입니다. 성능상 이슈가 있는 함수는 read() 이지요 :)