So laden Sie eine Datei über HTTP herunter und speichern Sie ihre Inhalte in einer Zeichenfolge in Java

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

Frage

Ich versuche, eine Datei über HTTP herunterzuladen und ihre Inhalte in einer Zeichenfolge zu speichern, wie der Titel heißt. Mein Ansatz ist also:

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();

Der Code schlägt fehl, wenn er versucht, aus dem Stream zu lesen, und die Berichterstattung des Streams ist geschlossen.

Wenn Sie nun versuchen, über einen Browser auf die Datei zugreifen zu können, wird sie nicht als Text serviert, sondern als Datei heruntergeladen.

Ich habe nirgendwo im Internet gesucht, also wäre ein kleiner Einblick sehr geschätzt!

Vielen Dank.

War es hilfreich?

Lösung

Kasse Httpclient von Apache Commons, insbesondere die GetResponseBodyAssstring () Methode.

Andere Tipps

Hier ist ein Code, der das für Sie tut. Zusätzlich zu dem, was Sie versuchen, kann es auch mit GZIP -Komprimierung handhaben (wenn Sie sie in die Headers einstellen Accept-Encoding: gzip, deflate) und automatisch Codierung für Sie erkennen (für die Handhabung von Zeichenfolgen erforderlich).

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();
}

Der Code ist von info.olteanu.utils.retrieve.RetrievePage, Phramer -Projekt.

Probieren Sie diesen Code aus, er ist möglicherweise nicht kompiliert, da ich ihn nicht getestet habe, aber es sollte daneben funktionieren, dass alle möglichen Ausnahmen nicht gefangen werden, aber Sie können dies leicht hinzufügen. Beachten Sie die Zeitüberschreitungen, verwenden Sie niemals unendliche Zeitüberschreitungen, da Ihr Programm irgendwann in Zukunft hängen wird, wenn die Ressource nicht verfügbar ist. Wenn Sie mehr als ein einfaches Abrufen von Textdateien tun, können Sie sich ansehen Httpclient der 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());
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top