Copia de archivos Java (cambiar el tamaño del búfer)
en Java java.io.InputStream,,java.io.OutputStream en
Presentamos un programa de muestra que realiza procesamiento de copias utilizando flujos de entrada/salida.
En el procesamiento de copias mediante secuencias, incluso los archivos grandes se pueden copiar con relativa rapidez aumentando el tamaño del búfer de lectura.
En el programa de muestra, el tamaño del búfer de lectura de datos se puede especificar con un argumento.
El área del búfer de lectura especificada está protegida dentro del montón de JavaVM, por lo que hacerlo demasiado grande dará como resultado una eficiencia deficiente. Por lo tanto, también verificamos el tamaño eficiente del búfer de lectura de datos al copiar archivos.
programa de muestra
/**
* Escribe datos del flujo de entrada al flujo de salida.
*El flujo de entrada/salida se cerrará una vez que se complete el proceso de copia.
* @param en el flujo de entrada
* @param flujo de salida del sistema operativo
* @param bufferSize Tamaño del búfer de lectura de datos (KB).
* @throws IOException Si ocurre alguna excepción en el procesamiento de entrada/salida
*/
copyStream público estático vacío (InputStream in, OutputStream os,
int bufferSize) lanza IOException {
int longitud = -1;
byte[] b = nuevo byte[bufferSize * 1024];
intentar {
while ((len = in.read(b, 0, b.length)) != -1) {
os.write(b, 0, len);
}
os.flush();
} finalmente {
si (en! = nulo) {
intentar {
cercar();
} captura (IOException e) {
e.printStackTrace();
}
}
si (os! = nulo) {
intentar {
os.cerrar();
} captura (IOException e) {
e.printStackTrace();
}
}
}
}
ejecución
Para copiar el archivo del programa de muestra, hemos preparado un archivo de 100 MB "100M.txt" directamente en la unidad C. En el programa de muestra, C:\100M.txt , lee datos en unidades de tamaño de búfer de 1000 KB. C:\a.txt Copiar a.
El ejemplo se ejecutó en el siguiente entorno.
SO: Windows XP
CPU: Athlon 1,46GHz
Memoria: 1GB
JRE: 1.6.4
◆Ejemplo de ejecución
/** * Ejemplo de ejecución * @param args */ public static void main(String[] args) { try { copyStream("C:\\100M.txt", "C:\\a.txt",1000); } captura (IOException e) { e.printStackTrace(); } }
Cambiar el tamaño del búfer
Para verificar el tamaño eficiente del búfer de lectura de datos al copiar archivos, use el tercer argumento de copyStream como
Los resultados de un procesamiento de copia similar en unidades de 1 KB, 100 KB, 1000 KB y 10 000 KB se resumen a continuación.
Aunque no se puede concluir solo a partir de los resultados anteriores, si especifica el tamaño del búfer de lectura de datos en unidades de 1000 KB,
Los resultados mostraron que era eficiente en términos de uso del montón y tiempo de procesamiento durante el procesamiento de copias.
Se obtuvieron resultados similares incluso cuando se aumentó el tamaño del archivo (aproximadamente 1 GB).
Por otro lado, al copiar un archivo pequeño (aproximadamente 1 MB o menos), aumentar el tamaño del búfer será un desperdicio, por lo que creo que es mejor especificar alrededor de 100 KB.
Utilice FileChannel para velocidades más rápidas
java.io.InputStream,,java.io.OutputStream
El procesamiento de copias es importante para comprender los flujos de entrada/salida, pero
Nuevas E/S introducidas en J2SE1.4 java.nio.channels.FileChannel#transferTo
Al utilizar este método, puede copiar archivos de manera aún más eficiente.
A continuación, le mostraré cómo copiar archivos fácil y rápidamente usando FileChannel.
⇒ Copia de archivos Java (fácil y rápido)