2013-08-07 5 views
0

Android 용 SpringFramework를 사용하여 입력 스트림을 가져 왔습니다.입력 스트림 메모리 부족 오류와 관련된 문제

@Override 
    public InputStream getImageStream(String url) { 

    InputStream is = new ByteArrayInputStream(template.getForObject(url, byte[].class)); 

    return is; 

} 

처음 몇 개의 입력 스트림에 대해서는 정상적으로 진행됩니다. 전혀 문제는 없지만 매우 큰 입력 스트림을 얻으려고합니다. 그럼 나는 outofmemory 오류가 발생합니다.

public byte[] readBytes(InputStream inputStream) throws IOException { 

     ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); 

     int bufferSize = 1024; 
     byte[] buffer = new byte[bufferSize]; 

     int len = 0; 
     while ((len = inputStream.read(buffer)) != -1) { 
     byteBuffer.write(buffer, 0, len); 
     } 

     byte[] byteArray= byteBuffer.toByteArray(); 

     return byteArray; 
} 

이 코드의 아이디어를 잘 덩어리에서의 InputStream을 읽는 것입니다 :

나는 다음과 같은 코드를 사용하여 글을 많이 볼?

그러나 readField 메서드를 시작하기 전에 내가 얻지 못한 outofmemory 오류가 있습니다. 사방에 리셋을 시도했는데 ... 어쩌면 readbytes 나 다른 무언가를 어딘가에서 지워야한다고 생각했습니다. 하지만 나는 그것이 어떻게 올바른지 모릅니다.

내가 잘못 생각하는 것 같아요? 나는 안드로이드와 자바에 매우 익숙하다. InputStream을 다른 방법으로 얻는 방법이 있는가? BufferedInputStream에 대해서도 읽었지만, 들어갈 수있는 방법을 생각할 수는 없습니다.

제 목표는 이미지의 얼룩을 데이터베이스에 저장하는 것입니다. 그리고 내 입력은 oauth를 통한 imgurl입니다.

다른 URL을 통해 입력 스트림의 품질이 떨어지는 버전을 호출 할 수도 있습니다. 그리고 모든 것은 작동합니다 ... 원본 이미지 URL로 시도하고 싶습니다. 아마도 나중에 사진을 인쇄하기 위해 원본을 다운로드 할 수 있기를 원하기 때문입니다.

답변

0

ByteArrayInputStream을 사용할 때 메모리의 전체 데이터를 읽기 때문에 OutOfMemory 오류가 발생합니다. 또한 ByteArrayOutputStream에 쓸 때 데이터를 메모리에 유지합니다 (바이트 배열의 단순한 래퍼). 아마도 캐시 대신 FileOutputStream을 사용해야 할 것입니다.

+0

그래서 저는 실제로 두 가지 일을하고 있습니까? readbytes 부분이 getimagestream 메소드에 있어야합니까? – Lokkio

+0

'template.getForObject (url, byte []. class)'는 바이트 배열 대신에'InputStream'을 리턴해야합니다. – aim

관련 문제