Cuatro métodos de implementación y comparación de rendimiento de la copia de archivos
Sin embargo, este es un método importante cuando necesitamos procesar archivos en el disco. En este punto, normalmente tenemos que implementar un método para completar la operación de copia del archivo nosotros mismos. A continuación se presentan cuatro implementaciones comunes de copia de archivos y se compara su rendimiento.
El ejemplo clásico más común. Lee un lote de bytes del flujo de entrada del archivo A y los escribe en el flujo de salida del archivo B.
Como puede ver, esta implementación requiere múltiples lecturas y escrituras para escribir datos, por lo que su eficiencia es un poco mediocre, limitada por el tamaño del búfer que proporcionamos.
La biblioteca de clases Java NIO introduce un método llamado transferFrom, que se ha documentado para realizar operaciones de copia más rápido que el método FileStream.
Appache Commons IO proporciona el método FileUtils.copyFile(File from, File to) para copiar archivos, que es una buena opción si utiliza esta biblioteca en su proyecto. También se implementa internamente utilizando FileChannel de Java NIO.
Si tienes algo de experiencia con Java 7, debes haberte encontrado con la clase de utilidad Archivos. El tamaño es 161M
Como se puede ver en los datos, para FileStream, la eficiencia de la copia depende en gran medida del valor de nuestro tamaño de búfer, lo que sin duda aumenta la carga de usarlo para copiar archivos.
¡Este no es el caso con el método NIO, que es tan eficiente como el mejor método en nuestras pruebas de FileStream tanto para archivos pequeños como grandes!
Entonces, saque la implementación anterior de FileStream de su proyecto, es hora de usar FileChannel.
Actualizado: 16 de junio de 2016 14:04
En términos generales, asigna una parte de la entrada a un búfer y la escribe en la salida. El tamaño máximo del búfer es. 8388608, si la longitud restante del archivo es menor que este valor, utilice la longitud restante del archivo como tamaño del búfer y continúe escribiendo hasta que se complete por completo.
Cabe señalar que el búfer no es la matriz de bytes que usamos habitualmente, sino el objeto MappedByteBuffer, que es un esquema de mapeo de memoria de archivos introducido por Java nio y tiene un alto rendimiento de lectura y escritura.