Comment télécharger un fichier via HTTP et stocker son contenu dans une chaîne en Java

StackOverflow https://stackoverflow.com/questions/1427508

Question

J'essaie de télécharger un fichier via HTTP et de stocker son contenu dans une chaîne, comme le titre l'indique. Mon approche est donc:

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 à partir du flux. Le rapport est fermé.

Maintenant, si vous essayez d'accéder au fichier via un navigateur, il ne sera pas servi sous forme de texte, mais sous forme de fichier à télécharger.

Je n'ai trouvé nulle part une recherche sur le Web à ce sujet, alors un petit aperçu serait très apprécié!

Merci.

Était-ce utile?

La solution

Découvrez HttpClient d'Apache Commons, en particulier le getResponseBodyAsString () .

Autres conseils

Voici un morceau de code qui le fait 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 le codage pour vous ( requis pour la manipulation des 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 provient de info.olteanu.utils.retrieve.RetrievePage , Phramer projet .

Essayez ce code, il pourrait ne pas compiler car je ne l’ai pas testé, mais il devrait fonctionner parallèlement au fait que toutes les exceptions possibles ne sont pas interceptées, mais vous pouvez l’ajouter facilement. Notez les délais, NE JAMAIS utiliser des délais infinis, car votre programme sera suspendu à l'avenir si la ressource n'est pas disponible. Si vous ne vous contentez pas de récupérer un fichier texte, consultez HTTPClient des Apache Commons.

    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());
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top