Cómo descargar un archivo a través de HTTP y almacenar su contenido en una Cadena en Java

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

Pregunta

Estoy tratando de descargar un archivo a través de HTTP y almacenar su contenido en una Cadena, como dice el título. Mi enfoque es así:

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

El código falla cuando intenta leer de la transmisión, informando que la transmisión está cerrada.

Ahora, si intenta acceder al archivo a través de un navegador, no se servirá como texto, sino como un archivo para descargar.

¡No he llegado a ningún lado buscando en la web sobre esto, por lo que agradecería un poco de información!

Gracias.

¿Fue útil?

Solución

Consulte HttpClient en Apache Commons, en particular el método getResponseBodyAsString () .

Otros consejos

Aquí hay un código que lo hace por usted. Además de lo que está intentando hacer, también puede manejar la compresión GZip (si la configura en los encabezados con Accept-Encoding: gzip, deflate ) y detecta automáticamente la codificación por usted ( requerido para manejar cadenas).

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

El código es de info.olteanu.utils.retrieve.RetrievePage , Phramer proyecto .

Pruebe este código, es posible que no se compile ya que no lo he probado, pero debería funcionar además de que no se detectan todas las excepciones posibles, pero puede agregarlo fácilmente. Tenga en cuenta los tiempos de espera, NUNCA use tiempos de espera infinitos ya que su programa se bloqueará en algún momento en el futuro si el recurso no está disponible. Si está haciendo algo más que una simple recuperación de archivos de texto, puede echar un vistazo a HTTPClient de 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());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top