2010-12-03 4 views

답변

1

Java 스트림의 read(byte[]) 메소드는 요청한 바이트보다 적은 바이트를 읽을 수 있습니다.

인터넷상의 파일 나는 HTTP URL의 내용을 의미한다고 가정합니다.

일부 HTTP 응답은 Content-Length를 미리 제공하지 않으며, 수행중인 것처럼 올바른 크기의 바이트 배열을 미리 할당 할 수도 없습니다.

안드로이드에서 사용할 수있는 Apache http 클라이언트 라이브러리는 URL의 내용을 완전히 가져 와서 적절한 크기의 바이트 배열로 반환하는 도우미 메서드 EntityUtils.toByteArray()을 이미 제공하고 있습니다. 메모리에 전체 응답을 읽는 항상 최선의 해결책이 아니라고

public byte[] fetchURL(String url) throws IOException, ClientProtocolException { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpGet httpget = new HttpGet(url); 
     HttpResponse response = httpclient.execute(httpget); 
     HttpEntity entity = response.getEntity(); 
     return EntityUtils.toByteArray(entity); 
} 

참고 :

는 여기를 사용하여 코드 조각입니다. 다운로드 진행률을 사용자에게보고하거나 큰 문서를 점차적으로 파싱하는 것이 좋습니다. 실제로 응답이 RAM (예 : 대형 비디오 스트림)에 맞지 않을 수도 있습니다.

1

정상 읽기 명령은 요청 된 길이까지 몇 바이트를 읽습니다. 리턴 값 (얼마나 많은 바이트가 읽혔는지 알려주는)의 체크를 포함하는 것은 프로그래머에게 달려있다. 요청 된 전체 길이를 읽도록 강제하는 readFully 메소드가 있지만 긴 시간 동안 차단하여 큰 스트림을 읽는 도중에 중단되지 않도록 할 수 있습니다.

1

내 바이트 배열이 호출 후에 만 ​​부분적으로 채워지는 이유가 무엇입니까?

예. 그래서 귀하의 안드로이드 응용 프로그램은 read 전화에서 돌아 오기 전에 전체 스트림이 다운로드 될 때까지 기다릴 필요가 없습니다.

특정 사용 사례에서 이것은 (분명히) 귀찮은 부분입니다. 다른 사용 사례, 그것은 read이 방식으로 작동 중요한 요구 사항은 다음과 같습니다

  • 응용 프로그램은 원격 서버가 계속 데이터를 송신하는 동안 사용자에게 처리 및 제공하는 결과를 시작해야 할 수 있습니다.

  • 원격 서버는 실제로 더 많은 데이터를 보내기 전에 클라이언트의 응용 프로그램 수준 응답을 기다리고있을 수 있습니다. HTTP 또는 FTP를 사용하는 경우에는 적용되지 않습니다. 그러나 읽는 스트림에서 전송 계층 소켓 스트림을 래핑하는 중일 수 있으며 그 수준에서는 모든 표현 계층 프로토콜 세부 정보에 대한 지식이 없습니다.

    • 루프를 사용 read는 0을 반환 할 때까지 계속 읽어 :에

    솔루션입니다.

  • Apache HttpClient를 사용하는 경우 응답의 전체 내용을 가져 오는 방법이 있습니다.
  • Apache Commons에는 전체 스트림 또는 판독기를 읽는 도우미 메서드가있는 IOUtils 클래스가 포함되어 있습니다.

현재이 동작은 read(byte[], ...) 메소드의 javadocs에 명시되어 있습니다.

관련 문제