Come scaricare un file su HTTP e archiviarne il contenuto in una stringa in Java
-
07-07-2019 - |
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.
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());