마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

자바 입출력 궁금한점입니다.

0 추천

먼저 소스를 보시겠습니다.

BufferedStream을 통해서 성능을 향상시킨코드입니다

FileInputStream inputStream = new FileInputStream(file);


FileOutputStream outputStream = new FileOutputStream(saveFullPath); BufferedInputStream bin = new BufferedInputStream(inputStream);

BufferedOutputStream bout = new BufferedOutputStream(outputStream);

int bytesRead = 0;
byte[] buffer = new byte[1024];

while ((bytesRead = bin.read(buffer, 0, 1024)) != -1) {
    bout.write(buffer, 0, bytesRead);
}

bout.close();
bin.close();
outputStream.close();
inputStream.close();

 

여기서 궁금한게 Byte[] buffer = new Byte[1024];

이게 꼭 필요한지 궁금합니다.

아래 while문에서도 buffer을 이용하는데..

이미 스트림 자체를 BufferedInputStream ㄱ리고 BufferedOutputStream으로 

즉, 버퍼스트림을 활용하는데 저렇게 바이트배열로 버퍼를 또 만들어서 쓰는것이

성능 향상에 도움이 되는지 궁금합니다.

선배님들의 주옥같은 조언 부탁드립니다.

갸아악 (21,260 포인트) 님이 2013년 7월 12일 질문

3개의 답변

+1 추천
 
채택된 답변

http://developer.android.com/reference/java/io/BufferedInputStream.html#read()

http://developer.android.com/reference/java/io/BufferedInputStream.html#read(byte[], int, int)

보시면 read()는 그냥 1byte씩 읽어서 바로바로 리턴하는걸로 보이고

read(byte[], int, int)는 array에 정해진 바이트만큼 담아서 리턴하는걸로 알고있습니다

사용용도는 저도 자세히는 잘 모르겠지만 서로데이터를 주고 받을때(네트워크 같은)  데이터 손실을 체크하거나

할때 쓸수도 있겠죠 보내는쪽에서 1024로 보내면 받는쪽에서 read()해서 바로바로읽다가 몇바이트 손실되면 받은파일이 에러가 날테니 받는쪽에서도 1024로 들어올때까지 버퍼에 담아놓아서 데이터 동기화 목적으로 쓰는게 아닌가 싶네요 

bangbang (8,820 포인트) 님이 2013년 7월 12일 답변
갸아악님이 2013년 7월 17일 채택됨
+1 추천
저 buffer라는 byte배열은 성능 향상이라기 보다는 문법에 맞추기 위해서 필요합니다.

성능이라면 저 byte배열의 크기에 영향을 받게 됩니다.

일반적으로 4KB (4096B) 로 크기를 잡는 것으로 알고 있구요.

그리고 정확한 성능 테스트는 직접 구현하여 돌려보면서 해보셔야 합니다.

 

추가로 말하자면, bout과 bin 스트림 변수만 close()하면, 스트림은 닫히게 됩니다.

outputStream과 inputStream을 다시 close() 할 필요가 없다라는 의미 입니다.
호군 (540 포인트) 님이 2013년 7월 12일 답변
0 추천

1024 byte 의 빈 공간을 만들어서 데이터를 이곳에 채운뒤 이 데이터를 out 하는 것이죠 

버퍼가 없으면 어디다가 데이터를 읽을수 있을까요?

bin.read(buffer, 0, 1024)

aucd29 (218,390 포인트) 님이 2013년 7월 12일 답변
저는 그냥 bis.read();
이렇게 햇엇거든요..
http://developer.android.com/intl/ko/reference/java/io/BufferedInputStream.html

synchronized int     read()
Reads a "single byte from this stream" and returns it as an integer in the range from 0 to 255.

read 를 하게 되면 스트림에서 1byte 씩 읽기 때문에 부하가 많이 걸리겠죠
...