2017-06-10 2 views
3

J'essaye de regarder un contenu de flux d'entrée de HttpClient, jusqu'à 64k bytes.Est-il possible de jeter un coup d'œil sur org.apache.http.conn.EofSensorInputStream de HttpClient?

Le flux provient d'un HttpGet, rien d'inhabituel à ce sujet:

HttpGet requestGet = new HttpGet(encodedUrl); HttpResponse httpResponse = httpClient.execute(requestGet); int status = httpResponse.getStatusLine().getStatusCode(); if (status == HttpStatus.SC_OK) { return httpResponse.getEntity().getContent(); }

Le flux d'entrée, il retourne est de type org.apache.http.conn.EofSensorInputStream

Notre cas d'utilisation est telle que nous devons « coup d'oeil "au premier (jusqu'à 64k) octets du flux d'entrée. J'utilise un algorithme décrit ici How do I peek at the first two bytes in an InputStream?

PushbackInputStream pis = new PushbackInputStream(inputStream, DEFAULT_PEEK_BUFFER_SIZE); byte [] peekBytes = new byte[DEFAULT_PEEK_BUFFER_SIZE]; int read = pis.read(peekBytes); if (read < DEFAULT_PEEK_BUFFER_SIZE) { byte[] trimmed = new byte[read]; System.arraycopy(peekBytes, 0, trimmed, 0, read); peekBytes = trimmed; } pis.unread(peekBytes);

Lorsque j'utilise un ByteArrayInputStream, cela fonctionne sans problème.

Problème: Lors de l'utilisation du org.apache.http.conn.EofSensorInputStream, je n'obtiens qu'un petit nombre d'octets au début du flux. généralement autour de 400 octets. Quand je m'attendais jusqu'à 64k octets.

J'ai également essayé d'utiliser un BufferedInputStream où je lis jusqu'à la première 64k octets puis appelez un .reset() mais cela ne fonctionne pas non plus. Même problème.

Pourquoi cela pourrait-il être? Je ne pense pas que quelque chose ferme le flux parce que si vous appelez IOUtils.toString(inputStream), je reçois tout le contenu.

Répondre

2

Voir contrat InputStream#read(byte[] b,int off,int len):

lit jusqu'à len octets de données à partir du flux d'entrée dans un tableau de octets. Une tentative est faite pour lire autant que len octets, mais un petit nombre peut être lu. Le nombre d'octets lus est retourné comme un entier

Au lieu d'utiliser cette méthode, utilisez IOUtils.read qui se lit jusqu'à ce que vous obtenez le nombre d'octets que vous avez demandé dans une boucle.

+0

aw dang it! une idée de comment le faire revenir plus? est-ce que j'utilise simplement le décalage et fais une autre demande? es-tu sûr que ce n'est pas juste de dire que ça retournera moins d'octets s'il n'en reste plus? –

+0

Oui, je suis tout à fait sûr. Vous avez juste besoin de continuer à lire dans une boucle jusqu'à ce que la quantité désirée de données ait été reçue ou que la fin du flux soit atteinte. – oleg

+0

OK! homme cool! l'essayer! –