2009-09-15 13 views
1

J'essaie de télécharger un fichier sur HTTP et de stocker son contenu dans une chaîne, comme l'indique le titre. Mon approche est la suivante:Comment télécharger un fichier sur HTTP et stocker son contenu dans une chaîne en Java

URL u = new URL("http://url/file.txt"); 

ByteArrayBuffer baf = new ByteArrayBuffer(32); 
InputStream in = (InputStream) u.getContent(); 
BufferedInputStream bis = new BufferedInputStream(in); 

int buffer; 
while((buffer = bis.read()) != -1){ 
    baf.append((byte)buffer); 
} 

bis.close(); 
in.close(); 

Le code échoue lorsqu'il essaie de lire dans le flux, signalant que le flux est fermé. Maintenant, si vous essayez d'accéder au fichier via un navigateur, il ne servira pas de texte, mais plutôt de fichier à télécharger.

Je n'ai jamais eu besoin de chercher sur le web, alors un petit aperçu serait très apprécié!

Merci.

Répondre

2

Extraire HttpClient d'Apache Commons, en particulier la méthode getResponseBodyAsString().

+0

i reponse.getEntity effectivement utilisé() getContent() et il fonctionne comme un charme – alkar

+0

vous pouvez également voir l'exemple ici:. Http://www.mkyong.com/java/apache-httpclient-examples/ –

3

Voici un morceau de code qui fait cela pour vous. En plus de ce que vous essayez de faire, il est également capable de gérer la compression GZip (si vous le définissez dans les en-têtes avec Accept-Encoding: gzip, deflate) et détecte automatiquement l'encodage pour vous (nécessaire pour gérer les chaînes).

private InputStream prepareInputStream(String urlToRetrieve) throws IOException 
{ 
    URL url = new URL(urlToRetrieve); 
    URLConnection uc = url.openConnection(); 
    if (timeOut > 0) 
    { 
     uc.setConnectTimeout(timeOut); 
     uc.setReadTimeout(timeOut); 
    } 
    InputStream is = uc.getInputStream(); 
    // deflate, if necesarily 
    if ("gzip".equals(uc.getContentEncoding())) 
     is = new GZIPInputStream(is); 

    this.lastURLConnection = uc; 
    return is; 
} 
// detects encoding associated to the current URL connection, taking into account the default encoding 
public String detectEncoding() 
{ 
    if (forceDefaultEncoding) 
     return defaultEncoding; 
    String detectedEncoding = detectEncodingFromContentTypeHTTPHeader(lastURLConnection.getContentType()); 
    if (detectedEncoding == null) 
     return defaultEncoding; 

    return detectedEncoding; 
} 


public static String detectEncodingFromContentTypeHTTPHeader(String contentType) 
{ 
    if (contentType != null) 
    { 
     int chsIndex = contentType.indexOf("charset="); 
     if (chsIndex != -1) 
     { 
      String enc = StringTools.substringAfter(contentType , "charset="); 
      if(enc.indexOf(';') != -1) 
       enc = StringTools.substringBefore(enc , ";"); 
      return enc.trim(); 
     } 
    } 
    return null; 
} 


// retrieves into an String object 
public String retrieve(String urlToRetrieve) 
throws MalformedURLException , IOException 
{ 
    InputStream is = prepareInputStream(urlToRetrieve); 
    String encoding = detectEncoding(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(is , encoding)); 
    StringBuilder output = new StringBuilder(BUFFER_LEN_STRING); 
    String str; 
    boolean first = true; 
    while ((str = in.readLine()) != null) 
    { 
     if (!first) 
      output.append("\n"); 
     first = false; 
     output.append(str); 
    } 
    in.close(); 
    return output.toString(); 
} 

Le code est de info.olteanu.utils.retrieve.RetrievePage, Phramer project.

+0

merci beaucoup pour la partie gzip :) – Karussell

3

Essayez ce code, il pourrait ne pas compiler puisque je ne l'ai pas testé mais il devrait fonctionner à côté de toutes les exceptions possibles, mais vous pouvez facilement l'ajouter. Notez les délais, n'utilisez JAMAIS de délais d'attente infinis car votre programme se bloquera dans le futur si la ressource n'est pas disponible. Si vous faites plus qu'un simple fichier texte retrievement, vous pouvez jeter un oeil à HTTPClient des communes Apache.

URL url = new URL("http://mydomain.com/file.txt"); 
    URLConnection urlConnection = url.openConnection(); 
    urlConnection.setConnectTimeout(1000); 
    urlConnection.setReadTimeout(1000); 
    BufferedReader breader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 

    StringBuilder stringBuilder = new StringBuilder(); 

    String line; 
    while((line = breader.readLine()) != null) { 
     stringBuilder.append(line); 
    } 

    System.out.println(stringBuilder.toString()); 
+0

Oh, il n'y a pas de manipulation pour les Charsets. Mais ce code devrait vous donner un point de départ. – Malax

+0

J'ai déjà essayé ceci, il lit une chaîne vide. Laissez-moi vérifier HTTPClient. – alkar

Questions connexes