Para la lectura de cualquier flujo de entrada en un búfer hay dos métodos. Alguien me puede ayudar a entender cuál es el mejor método y por qué? Y en que situación nos debe utilizar cada método?

  • Lectura línea por línea, y anexar al buffer.

Por ejemplo:

public String fileToBuffer(InputStream is, StringBuffer strBuffer) throws IOException{
    StringBuffer buffer = strBuffer;
    InputStreamReader isr = null;

    try {
        isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line = null;

        while ((line = br.readLine()) != null) {
            buffer.append(line + "\n");
        }
    } finally {
        if (is != null) {
            is.close();
        }
        if (isr != null) {
            isr.close();
        }
    }

    return buffer.toString();
}

  • De lectura de hasta el tamaño de búfer es decir 1024 bytes en una matriz de char.

Por ejemplo:

InputStreamReader isr = new InputStreamReader(is);
final int bufferSize = 1024;
char[] buffer = new char[bufferSize];
StringBuffer strBuffer = new StringBuffer();

/* read the base script into string buffer */
try {
    while (true) {
        int read = isr.read(buffer, 0, bufferSize);
        if (read == -1) {
           break;
        }

        strBuffer.append(buffer, 0, read);
     }
} catch (IOException e) {
}
InformationsquelleAutor user1731553 | 2013-01-18

3 Comentarios

  1. 3

    Considerar

    public String fileToBuffer(InputStream is, StringBuffer strBuffer) throws IOException {
        StringBuilder sb = new StringBuilder(strBuffer);
        try (BufferedReader rdr = new BufferedReader(new InputStreamReader(is))) { 
            for (int c; (c = rdr.read()) != -1;) {
                sb.append((char) c);
    
            }
        }
        return sb.toString();
    }
    • +1 para mostrar intentar cláusula de java 7 🙂
    • Considere por qué?
    • Usted está ofreciendo un único byte del búfer de versión como un mejora de la?
  2. 1

    Depende del propósito.

    Para trabajar con archivos de texto leer las líneas (si los necesita).

    Para trabajar con datos binarios puros uso de bloques de bytes.

    En ejemplos trozos de bytes son más robustos.
    ¿Qué pasa si una línea es demasiado larga y rompe algunos de los objetos intermedios?

    Si el archivo es binario, ¿usted sabe el tamaño de una línea?
    Puede ser el tamaño de archivo.

    Tratando de «tragar» demasiado grande Cadena puede causar ErrorOutOfMemory.
    Con 1024 bytes es (bueno casi) nunca sucede.

    Chunking por 1024 bytes puede tomar más tiempo, pero su más confiable.

    • Él no tiene trozos de bytes en su ejemplo. Él ha trozos de caracteres.
    • Gracias, pero no cambia mucho. La lógica sigue siendo la misma.
  3. 0

    El uso de ‘readLine’ no está tan claro. El autor de la pregunta del método 2 es bastante estándar, pero el siguiente método es único (y probablemente mejor):

    //read the whole inputstream and put into a string
    public String inputstream2str(InputStream stream) {
      Scanner s = new Scanner(stream).useDelimiter("\A");
      return s.hasNext()? s.next():"";
    }

    De una Cadena, se puede convertir a la matriz de bytes o lo que sea buffer que quieres.

    • ¿Por qué es la lectura línea por línea peligrosa? (No es que yo no estoy de acuerdo, pero usted debe indicar sus razones.) Y dado que, ¿cuál es la diferencia entre la lectura línea por línea y escaneo con un caracter delimitador? Respuesta: cero. Entonces, ¿por qué lo recomendamos?
    • La lectura línea por línea puede ser peligroso porque si empezar a leer línea por línea en un archivo binario, el tamaño de la línea podría ser igual al tamaño del archivo. Líneas de sentido mientras se trabaja con archivos de texto solamente.

Dejar respuesta

Please enter your comment!
Please enter your name here