2011-05-07 3 views
2

내가 웹 사이트에서 다양한 정보를 얻기 위해 또는 (구글 맵 지오 같은) 웹 서비스를 사용하기 위해 자바의 다양한 HTTP 클라이언트를 사용하고있다HTTP 클라이언트에서 InputStream이 필요한 이유는 무엇입니까? (자바)

내가 함께 일하고 있어요 현재 클라이언트는 HTTP Components client에서입니다 아파치.

나는 항상 URL의 모든 내용을 제공하는 .getText() 또는 .getBytes() 메서드가 없지만 대신에 InputStream을 반환하는 메서드가 있는지 궁금합니다. 그 요점이나 이유는 무엇입니까?

나는 계속해서 서버와 comunicate하지 않으므로 스트림을 계속 확인해야한다. HTTP에는 상태가 없으므로 수신 된 후 HTTP 응답의 내용 (String 또는 byte [])을 반환하는 getText()/getBytes() 메서드가없는 이유는 무엇입니까?

답변

6

서버가 스트림에서 결과를 출력하기 시작하고 클라이언트가이를 얻게되기 때문에. 해당 스트림을 메모리에 버퍼링하여 String/byte[]으로 변환 할 수 있지만 일부를 처리하여 버릴 수도 있습니다.

+1

네,하지만 내 응답 객체가 수신 될 때까지 데이터가 수신되었고 연결이 닫혔습니다 - 맞습니까? – Dexter

+1

아닙니다. HttpClient는 최소한 응답 엔터티 본문이 완전히 소비 될 때까지 열려있는 기본 연결에서 데이터를 스트리밍합니다. – oleg

2

네트워크이므로, 그것은 스트림이기 때문에; 서버 응답이 임의로 커질 수 있기 때문입니다. 동일한 추론이 파일에 적용됩니다.

1

이미 언급 한 것 외에 입력 스트림은 필수 조건입니다. HTTP 서버는 -Xmx512M을 사용하여 JVM에서 실행중인 클라이언트에 1GB 응답을 제공합니다. getBytes() 또는 getString()OutOfMemoryError 인 반면 입력 스트림 (한 번에 1K)을 읽는 것은 완벽합니다.

+0

따라서 입력 스트림에서 데이터를 읽을 때까지 데이터가 JVM의 메모리로 읽히지 않습니다. 저는 항상 클라이언트가 HTTP 작업을한다고 가정하고 응답과 관계없이 연결을 닫습니다. – Dexter

+0

이것은 전적으로 클라이언트에 달려 있지만 위의 시나리오에서는 전체 응답을 메모리로 읽는 클라이언트가 충돌합니다. 내가 아는 한 HttpClient (HttpMethodBase, 실제로)에서는 응답이 바이트 배열로 메모리에 읽히든지 클라이언트가 네트워크를 통해 데이터를 읽는 입력 스트림이 반환되는지 여부에 따라 사용법에 달려있다. –

관련 문제