안드로이드에서 파일의 전체 길이를 읽도록 요청하면 인터넷상의 파일을 나타내는 입력 스트림을 읽을 때 내 바이트 배열이 호출 후에 만 부분적으로 채워지는 이유가 무엇입니까?android에서 java로 읽은 전체 파일을 읽을 수 있습니까?
답변
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 (예 : 대형 비디오 스트림)에 맞지 않을 수도 있습니다.
정상 읽기 명령은 요청 된 길이까지 몇 바이트를 읽습니다. 리턴 값 (얼마나 많은 바이트가 읽혔는지 알려주는)의 체크를 포함하는 것은 프로그래머에게 달려있다. 요청 된 전체 길이를 읽도록 강제하는 readFully 메소드가 있지만 긴 시간 동안 차단하여 큰 스트림을 읽는 도중에 중단되지 않도록 할 수 있습니다.
내 바이트 배열이 호출 후에 만 부분적으로 채워지는 이유가 무엇입니까?
예. 그래서 귀하의 안드로이드 응용 프로그램은 read
전화에서 돌아 오기 전에 전체 스트림이 다운로드 될 때까지 기다릴 필요가 없습니다.
특정 사용 사례에서 이것은 (분명히) 귀찮은 부분입니다. 다른 사용 사례, 그것은 read
이 방식으로 작동 중요한 요구 사항은 다음과 같습니다
응용 프로그램은 원격 서버가 계속 데이터를 송신하는 동안 사용자에게 처리 및 제공하는 결과를 시작해야 할 수 있습니다.
원격 서버는 실제로 더 많은 데이터를 보내기 전에 클라이언트의 응용 프로그램 수준 응답을 기다리고있을 수 있습니다. HTTP 또는 FTP를 사용하는 경우에는 적용되지 않습니다. 그러나 읽는 스트림에서 전송 계층 소켓 스트림을 래핑하는 중일 수 있으며 그 수준에서는 모든 표현 계층 프로토콜 세부 정보에 대한 지식이 없습니다.
- 루프를 사용
read
는 0을 반환 할 때까지 계속 읽어 :에 - Apache HttpClient를 사용하는 경우 응답의 전체 내용을 가져 오는 방법이 있습니다.
- Apache Commons에는 전체 스트림 또는 판독기를 읽는 도우미 메서드가있는 IOUtils 클래스가 포함되어 있습니다.
솔루션입니다.
현재이 동작은 read(byte[], ...)
메소드의 javadocs에 명시되어 있습니다.
- 1. 파일을 읽을 수 있습니까?
- 2. GZipStream 전체 파일을 읽을 수 없습니다.
- 3. android에서 ftp 파일을 읽을 수 없습니까?
- 4. 어디서 파일을 읽을 수 있습니까?
- 5. 어떻게 파일을 특정 문자로만 읽을 수 있습니까?
- 6. Android에서 URL을 읽을 수 없음
- 7. CFPreferences는 "전체 앱"을 읽을 수 있습니까?
- 8. Android에서 java로 mp3 파일 다운로드
- 9. ExtAudioFile 읽기로 오디오 파일을 읽을 때 연속적으로 오디오 파일을 읽을 수 있습니까?
- 10. StreamReader를 사용하여 Silverlight에서 파일을 읽을 수 있습니까?
- 11. PHP에서 큰 xlsx 파일을 읽을 수 있습니까?
- 12. 어떻게하면 텍스트 파일을 읽을 수 있습니까?
- 13. AS3 : ppt 파일을 읽을 수 있습니까?
- 14. C# : Server.Mapath가 어떻게 파일을 읽을 수 있습니까?
- 15. Phonon은 MacOS에서 .avi 파일을 읽을 수 있습니까?
- 16. Java로 읽은 후에 직렬화 된 데이터를 잊는 방법?
- 17. Android 음성 - Android에서 텍스트를 어떻게 읽을 수 있습니까?
- 18. node.js는 URL로부터 읽을 수 있습니까?
- 19. saxParser 파일을 읽을 수 없습니다
- 20. BlobStore에서 파일을 읽을 수 없습니다.
- 21. Silverlight에서 전체 어셈블리를로드하지 않고 어셈블리 매니페스트를 읽을 수 있습니까?
- 22. 파이프에서 gcc를 읽을 수 있습니까?
- 23. 텍스트 파일을 한 줄씩 파일을 읽고 각 줄을 android를 사용하여 배열에 저장하는 방법은 무엇입니까? xls 파일을 android에서 읽을 수 있습니까?
- 24. 캐비닛 파일을 Java로 생성
- 25. 전체 SVN 전체에 걸쳐 README.txt를 읽은 후에
- 26. .ai 파일을 Java로 표시
- 27. 이미지를 java로 할 수 있습니까?
- 28. 어떻게하면 PDF 파일을 Java로 인쇄 할 수 있습니까? Swing
- 29. 순수 Java로 JAR 파일을 어떻게 verifiy 할 수 있습니까?
- 30. Android에서 전체 이미지보기로 전환