안드로이드 개발 질문/답변
(글 수 358)
public void add(String name, InputStream is, String password)
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DeflaterOutputStream dos = new DeflaterOutputStream(bos, new Deflater(9, true), 1024);
int read=0;
long inputLen = 0;
byte[] buf = new byte[1024];
while ((read = is.read(buf)) > 0) {
inputLen += read;
dos.write(buf, 0, read);
}
dos.close();
안녕하세요.
위에 소스 보시면 고수분들께서는 금방 아시겠지만,
add 함수를 부를 때 is로 큰 파일이 오면 while문에서 바로 Outofmemory가 발생합니다.
며칠째 이거랑 싸우고 있는데 마땅한 대안이나 해법도 모르겠습니다.
아시는분.. 그냥 지나치지 마시고 꼭 저좀 살려주세요.
감사합니다.
2013.01.21 18:26:29
ByteArrayOutputStream의 특성이 모든 데이터를 메모리에 잡는다고 합니다.
그래서 힙보다 큰 데이터는 저장할수 없다고 하네요.
그럼 안드로이드 힙메모리를 늘리는거나 다른 스트림을 이용하는 방법이 있을수 있겠는데요,
안드로이드는 힙메모리를 늘리는데 한계가 있고 비효율적이기 때문에,
파일을 취급 하시는거라면 이거 말고 다른 outputstream 을 이용해보시면 어떨까요?
만약 네트워크 전송을 목적으로 하시는거라면 해보지는 않았지만.. 읽자마자 바로 전송할수 있도록 flush() 를 이용하는 구조로 변경해보시던가요..
Menifest에 LargeHeap 선언해보세요