Se FileInputStream no amortiguada y por qué BufferedInputStream es más rápido?

Ruizhi:

acerca de la IO, tengo dos preguntas.

A. En un tutorial y algunas respuestas StackOverflow, que afirmó que FileInputStreamno está tamponada. es eso cierto ?

La siguiente uso código FileInputStreampara leer datos en una matriz de bytes (1024 bytes)

class Test {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("./fos.txt");
        FileOutputStream fos = new FileOutputStream("./copy.txt");

        byte[] buffer = new byte[1024];   // Is this a buffer ? 

        int len;
        while ((len = fis.read(buffer))!= -1) {
            fos.write(buffer);
        }

        fos.close();
        fis.close();
    }
}

A partir de la API, hay una línea:

public int lectura (byte b []) throws IOException

  • @param b: el tampón en el que se leen los datos.

B. Si ambos están amortiguada, ambos ponen los datos en el búfer, y recuperar los datos de la memoria intermedia, donde es exactamente el lugar que hace BufferedInputStreammás rápido que FileInputStream?

Gracias

Peter Lawrey:

En un tutorial y algunas respuestas StackOverflow, alegaron que FileInputStream no se amortigua. es eso cierto ?

Escrito a cualquier archivo es amortiguada por el sistema operativo, sin embargo, en este caso, no es amortiguada por Java. Buffering ayuda cuando se realizan muchas escrituras pequeñas, un 1 KB de escritura no es pequeña.

El código siguiente uso FileInputStream para leer datos en una matriz de bytes (1024 bytes)

    int len;
    while ((len = fis.read(buffer))!= -1) {
        fos.write(buffer);
    }

Este bucle se rompe ya que supone leer siempre exactamente 1.024 bytes y la longitud del archivo es siempre un múltiplo de 1024.

En su lugar, debe escribir la longitud que se leyó.

    for (int len; (len = fis.read(buffer))!= -1; )
        fos.write(buffer, 0, len);

Si ambos están tamponadas, ambos se ponen los datos en el búfer, y recuperar los datos de la memoria intermedia, donde es exactamente el lugar que hace BufferedInputStream más rápido que FileInputStream?

En este caso, el BufferedInputStream utilizará un buffer de 8 KB de forma predeterminada. Esto reducirá el número de llamadas al sistema hasta en un factor de 8, sin embargo, sería mucho más simple en su caso de usar sólo un 8 KB byte[]y ahorrar algo de copias redundantes.

public static void main(String[] args) throws IOException {
    try (FileInputStream fis = new FileInputStream("./fos.txt");
         FileOutputStream fos = new FileOutputStream("./copy.txt")) {

        byte[] buffer = new byte[8 << 10]; // 8 KB
        for (int len; (len = fis.read(buffer)) != -1; )
            fos.write(buffer, 0, len);
    }
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=225487&siteId=1
Recomendado
Clasificación