Actualmente utilizo la siguiente función para hacer un simple GET de HTTP.

public static String download(String url) throws java.io.IOException {
    java.io.InputStream s = null;
    java.io.InputStreamReader r = null;
    //java.io.BufferedReader b = null;
    StringBuilder content = new StringBuilder();
    try {
        s = (java.io.InputStream)new URL(url).getContent();

        r = new java.io.InputStreamReader(s);
        //b = new java.io.BufferedReader(r);

        char[] buffer = new char[4*1024];
        int n = 0;
        while (n >= 0) {
            n = r.read(buffer, 0, buffer.length);
            if (n > 0) {
                content.append(buffer, 0, n);
            }
        }
    }
    finally {
        //if (b != null) b.close();
        if (r != null) r.close();
        if (s != null) s.close();
    }
    return content.toString();
}

Veo ninguna razón para utilizar la BufferedReader ya me voy a descargar todo en la secuencia. Estoy en lo cierto al pensar que no hay ningún uso para el BufferedReader en este caso?

OriginalEl autor Frank Krueger | 2008-08-28

4 Comentarios

  1. 4

    En este caso, me gustaría hacer lo que están haciendo (utilizar una matriz de bytes para el almacenamiento en búfer y no uno de los búferes de secuencia).

    Hay excepciones, sin embargo. Uno puede ver los búferes de salida (en este momento) en el servlet API. Los datos no se escriben en la secuencia subyacente hasta flush() se llama, que permite búfer de salida, pero luego de volcado del buffer si se produce un error y escribir una página de error en su lugar. Usted podría búfer de entrada si usted necesita para restablecer la corriente de releer el uso de marca(int) y reset(). Por ejemplo, tal vez a usted le inspeccionar el encabezado del archivo antes de decidir sobre el contenido de controlador para pasar el flujo a.

    Ajenas, pero creo que se debe volver a escribir la secuencia de manejo. Este patrón funciona mejor para evitar pérdidas de recursos:

        InputStream stream = new FileInputStream("in");
        try { //no operations between open stream and try block
            //work
        } finally { //do nothing but close this one stream in the finally
            stream.close();
        }

    Si se abren varios arroyos, nido de bloques try/finally.

    Otra cosa que su código está haciendo la suposición de que la devuelve el contenido está codificado en su VM conjunto de caracteres por defecto (aunque eso podría ser suficiente, dependiendo del caso de uso).

    OriginalEl autor McDowell

  2. 1

    Estás en lo correcto, si el uso de clases bufferedreader para leer el contenido de HTTP y las cabeceras usted querrá InputStreamReader así que usted puede leer byte a byte.

    Clases bufferedreader en este escenario, a veces hace cosas raras…escpecially cuando se trata de leer el POST de HTTP headers, a veces usted no será capaz de leer el mensaje de datos, si se utiliza el InputStreamReader usted puede leer el contenido de longitud y leído que muchos bytes…

    OriginalEl autor mmattax

  3. 1

    Cada invocación de uno de los InputStreamReader‘s read() métodos puede causar uno o más bytes para ser leído desde el subyacente de bytes del flujo de entrada. Para habilitar la conversión eficiente de bytes a caracteres, más de bytes que pueden ser leídos por delante de la secuencia subyacente que son necesarios para satisfacer la actual operación de lectura.

    OriginalEl autor Harsh Bandlish

  4. 0

    Mi instinto me dice que ya que estamos realizando el almacenamiento en búfer mediante el uso de la matriz de bytes, es redundante el uso de las clases bufferedreader.

    OriginalEl autor Allain Lalonde

Dejar respuesta

Please enter your comment!
Please enter your name here