안드로이드 개발 질문/답변
(글 수 45,052)
ZipInputStream.available() 이게 리턴값이 어떻게 산출되는건지 모르겠습니다.
기존에 최하버전이 2.2엿던 프로젝트를 3.0으로 변경하면서 문제가 발생했습니다.
제가 압축 소스를 구해서 쓴거라서 100% 이해는 못하고 사용하고있었는데요.
리소스 저장 속도가 현저히 느려져서(2.2버전때는 빨랏습니다.) Log하나하나찍어가면서 확인해봤더니
파일 읽는 부분(?)에서 느려지는것같더라구요.
byte[] buffer = new byte[zis.available()]; fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos, zis.available()); int count = 0; while((count = zis.read(buffer, 0, zis.available())) != -1){ bos.write(buffer, 0, count); }
이 부분에서 zis.available() 리턴값을 찍어보니까 1이더라구요. 그래서 반복문이 5만번정도 돌더라구요...
압축풀기 소스구할때 buffer 생성할때 크기를 1024같이 직접입력해준 소스들도 본것같은데
아무래도 buffer 크기때문에 그런게 아닌가 싶어서요.
API를 찾아봐도 영어를 잘못하는편이라 이해가 많이 어렵습니다 ㅠㅠ
available() 리턴값이 때문에 느려지는게 맞는지 질문드립니다..
도움 좀 부탁드려요.
2012.12.13 17:34:26
int bufferSize = 4096; byte[] buffer = new byte[bufferSize]; fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos); //BufferedOutputStream의 버퍼 사이즈 기본은 8k 입니다. int count = 0; while((count = zis.read(buffer)) != -1){ bos.write(buffer, 0, count); }
버퍼 사이즈 늘려주고 위에 처럼 하시면 됩니다.
버퍼 사이즈를 하드코딩한다고 문제 되진 않습니다.
그리고 버퍼를 무한정 늘린다고 속도가 빨라지진 않습니다.
하지만 너무 적으면 느려지는건 사실입니다.
zis.available() 값이 1이라면 버퍼의 크기도 1byte가 되니 당연히 느려집니다.
stream 클래스의 available메소드를 신뢰하면 안됩니다.
버퍼의 크기를 늘려주시면 속도가 향상될 것 입니다.