Domanda

Sto cercando di scaricare un file su HTTP e di memorizzarne il contenuto in una stringa, come dice il titolo. Il mio approccio è quindi:

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

Il codice ha esito negativo quando tenta di leggere dallo stream, segnalando che lo stream è chiuso.

Ora se provi ad accedere al file tramite un browser, non verrà servito come testo, piuttosto che come file da scaricare.

Non sono arrivato da nessuna parte a cercare sul web su questo, quindi un po 'di approfondimento sarebbe molto apprezzato!

Grazie.

È stato utile?

Soluzione

Scopri HttpClient da Apache Commons, in particolare metodo getResponseBodyAsString () .

Altri suggerimenti

Ecco un pezzo di codice che lo fa per te. Oltre a ciò che stai tentando di fare, è anche in grado di gestire la compressione GZip (se la imposti nelle intestazioni con Accept-Encoding: gzip, deflate ) e rileva automaticamente la codifica per te ( necessario per la gestione delle stringhe).

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

Il codice proviene da info.olteanu.utils.retrieve.RetrievePage , Phramer progetto .

Prova questo codice, potrebbe non essere compilato poiché non l'ho testato ma dovrebbe funzionare a parte il fatto che tutte le possibili eccezioni non vengono rilevate, ma puoi aggiungerlo facilmente. Nota i timeout, MAI utilizzare infiniti timeout poiché il tuo programma si bloccherà in futuro se la risorsa non è disponibile. Se stai facendo qualcosa di più di un semplice recupero di file di testo, potresti dare un'occhiata a HTTPClient degli 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());
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top