2012-12-11 3 views
0

누군가가 아래 코드를 확인하고 수행해야 할 일이 있는지 확인할 수 있습니까? 내가 정말로 걱정하고있는 것은 성능입니다. 그렇지 않다면 코드 가독성을 개선하기 위해 더 잘 수행 할 수있는 것이 있습니까?URL에서 이미지 읽기 - 성능 문제가 있습니까?

try { 

    URL url = new URL("http://www.pudim.com.br/SiteBuilder/UploadUsers/pudim.com.br/pudim.jpg"); 
    URLConnection uc = url.openConnection(); 
    String type = uc.getContentType(); 
    BufferedImage image = ImageIO.read(url); 
    ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    ImageIO.write(image, "jpg", os); 
    byte[] bytes = os.toByteArray(); 
    InputStream is = new ByteArrayInputStream(bytes); 

    // not important :) ... 
} catch (AmazonServiceException e) { 
    e.printStackTrace(); 
} catch (AmazonClientException e) { 
    e.printStackTrace(); 
} catch (MalformedURLException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

모든 사항을 환영합니다.

감사합니다.

+4

왜 이미지를 읽고 쓰는데'ImageIO'를 사용하고 있습니까? 왜 그냥 URLConnection의'InputStream'을 사용하여 내용을 읽지 않는가? – MadProgrammer

답변

0

URL에서 읽을 때 일반적으로 발생하는 모든 성능 문제 - 연결/대역폭/가용성 저하. 동일한 솔루션이 적용됩니다. 로컬 캐시를 만들고 사용하며, 백그라운드 스레드에 IO를로드하거나 (UI UI 스레드를 차단하지 않기 위해) IO를 수행합니다. ...

이 예제에서는 결과로 InputStream을 실제로 수행하지 않습니다. 원하는대로 전체적으로 필요한지 여부를 고려하십시오. - 그대로, 전체 이미지를 매번 메모리에로드합니다. 수행중인 모든 작업을 디스크에 저장하는 경우에는 필요하지 않습니다.

0

이미지를 다운로드하는 중일 경우 BufferedInputStream 을 사용하여 아래의 네트워크에서 최대한 빨리 데이터를 읽을 수 있습니다.

마찬가지로 로컬 파일의 FileOutputStreamBufferedOutputStream을 사용하여 덤프 할 수 있습니다.

이미지 처리가 필요하지 않습니다.

+0

사실이 코드의 목적은 URL에서 가져온 이미지를 내 AWS S3 버킷에 저장하는 것입니다. 그 이유는 내가 '바이트 [] 바이트 = os.toByteArray();',이 파일의 길이를 얻을. InputSream과 OutputStreams에 대해 많이 알지 못하기 때문에, 나는 바보 같은 짓을하고 있는지 확인해달라고 요청했다. :) – Bruno

+0

그래야 파일 내용이 담긴 바이트 배열을 메모리에 갖고 싶으면 BufferedInputStream은 데이터를 빨리 읽고, ByteArrayOutputStream에 쓰는 중입니다. 그리고 나서 'ByteArrayOutputStream' 배열의 크기를 얻었고 저장소에 쓰기를 원하면'BufferedOutputStream'을 사용하여'write (bytes)'를 수행하십시오. 여기서 bytes는 ByteArrayOutputStream의 배열입니다. ImageIO를 사용할 필요가 없으므로 이미지 처리만으로는 쓸모가 없습니다. – jbx

+0

그건 그렇고,'URLConnection'은 실제로 당신이받을 권리가있는 컨텐츠의 크기를 알려주는'getContentLength()'메소드를 제공한다는 것을 알고 있습니까? 그것은 비트 웹 서버에 의존하지만 때로는 항상 제공되는 것은 아닙니다 (HTTP 1.1에서는 필요하지만 일부는이를 잘못 구현합니다) – jbx