2010-04-16 5 views
3

J'ai une classe Dispatcher HTTP qui fonctionne la plupart du temps, mais j'ai remarqué qu'elle "stalle" lors de la réception de demandes plus volumineuses. Après avoir examiné le problème, j'ai pensé que je n'allouais peut-être pas assez d'octets au tampon. Avant, je faisais:Java HTTP Requests Taille du tampon

byte[] buffer = new byte[10000]; 

Après avoir changé à 20000, il semble s'être arrêté stabulation:

String contentType = connection.getHeaderField("Content-type"); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

      InputStream responseData = connection.openInputStream(); 
      byte[] buffer = new byte[20000]; 
      int bytesRead = responseData.read(buffer); 
      while (bytesRead > 0) { 
       baos.write(buffer, 0, bytesRead); 
       bytesRead = responseData.read(buffer); 
      } 
      baos.close(); 
      connection.close(); 

que je fais ce droit? Y at-il de toute façon que je peux définir dynamiquement le nombre d'octets pour le tampon basé sur la taille de la demande?

Merci ...

Répondre

1

C'est la mauvaise façon de streaming à partir de l'entrée à la sortie. Le droit chemin est:

byte[] buffer = new byte[10000]; 
int bytesRead = 0; 
while ((bytesRead = responseData.read(buffer)) > 0) { 
    baos.write(buffer, 0, bytesRead); 
} 

ou

byte[] buffer = new byte[10000]; 
for (int bytesRead = 0; (bytesRead = responseData.read(buffer)) > 0;) { 
    baos.write(buffer, 0, bytesRead); 
} 

Voir aussi la Sun tutorial on the subject.

Un tampon de 1 ~ 2K (1024 ~ 2048) est par ailleurs souvent plus que suffisant.

+0

Merci pour le conseil! – littleK

+0

De rien. – BalusC

3

Si vous êtes ouvert à l'aide de bibliothèques externes, la bibliothèque Apache IOUtils a une toByteArray qui va convertir un flux d'entrée à un tableau d'octets sans aucun travail de votre part.

Il est aussi simple que:

byte[] buffer = IOUtils.toByteArray(connection.openInputStream()); 
+0

Malheureusement, je travaille sur une plate-forme qui n'offre pas un grand support pour les bibliothèques externes. J'apprécie votre aide, cependant! – littleK