2009-12-21 11 views
2

Je suis confronté à un problème de connexion Http. mon code:Http connexion URL ne peut pas lire complètement

URL url = null; 
try { 
    url = new URL(_url); 
} catch (MalformedURLException e) { 
} 

if (url != null) { 
    HttpURLConnection urlConn = null; 
    InputStreamReader isr = null; 
    try { 
     urlConn = (HttpURLConnection)url.openConnection(); 
     urlConn.setRequestMethod("GET"); 
     urlConn.setConnectTimeout(45000); 

     if(response == HttpURLConnection.HTTP_OK) { 
      StringBuffer readData = new StringBuffer(""); 
      int size = 1024; 
      char[] buffer = new char[size]; 
      int len; 
      isr = new InputStreamReader(urlConn.getInputStream()); 
      while ((len = isr.read(buffer, 0, size)) > 0) { 
       readData.append(buffer, 0, len); 
      } 
     } 
    } 
    catch(Exception e) { 
    } 
    finally { 
     if(urlConn != null) { 

     try { 
      urlConn.disconnect(); 
     } catch(Exception e) {    
     } 
    } 
    if(isr != null) { 
     try { 
      isr.close(); 
     } catch(Exception e) {     
     }    
    } 
} 

Ce code ne peut pas télécharger complètement les données. Par exemple: Taille totale à lire: 13901 octets code ci-dessus peut lire taille: 12937 octets

Quel est le problème ici?

S'il vous plaît des conseils gars.

+0

Comment savez-vous que c'est 13901 octets? Est-ce dans l'en-tête HTTP content-length ou regardez-vous le fichier que vous diffusez sur le disque? – Paolo

+0

La documentation indique que -1 est renvoyé lorsque vous arrivez à la fin du flux, et non sur 0. Même avec cette correction, je suppose que la réponse de Ramp est probablement la raison pour laquelle vous rencontrez des problèmes. http://java.sun.com/j2se/1.5.0/docs/api/java/io/InputStreamReader.html#read%28char[],%20int,%20int%29 – rui

+0

Bien, InputStream n'est pas autorisé pour renvoyer 0 si au moins 1 octet est demandé, donc vérifier que 'if (count> 0)' est correct. – StaxMan

Répondre

3

J'ai vérifié votre code et il semble que ce soit OK. Mais vous devez garder à l'esprit que vous lisez des caractères (type 2 octets) - ainsi votre readData.length() montrera le nombre de caractères, pas d'octets. J'ai fait un test et changé votre InputStreamReader en BufferedInputStream et le type de tampon en byte []. Le code lit exactement le nombre d'octets que je m'attendais.
Regads!

+0

Bien que le point sous-jacent de la conversion de caractères soit valide, votre commentaire sur la prise de caractères de 2 octets n'est généralement pas correct - seul UTF-16/UCS-2 a un encodage fixe de 2 octets par caractère. serveurs web. UTF-8 est un encodage de longueur variable (1 à 3 octets par caractère Java); Latin-1 est fixé 1 octet par caractère et ainsi de suite. – StaxMan

0

Aussi pour ajouter à la réponse acceptée: Je considérerais le code buggy car il ne spécifie pas quel encodage de caractères InputStreamReader doit utiliser - c'est la plate-forme par défaut, qui peut être différente de celle utilisée par la ressource. Donc, soit toujours spécifier le codage à utiliser explicitement ("UTF-8"), ou utiliser une bibliothèque qui le fait.

Questions connexes