acerca de la IO, tengo dos preguntas.
A. En un tutorial y algunas respuestas StackOverflow, que afirmó que FileInputStream
no está tamponada. es eso cierto ?
La siguiente uso código FileInputStream
para 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 BufferedInputStream
más rápido que FileInputStream
?
Gracias
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);
}
}