Estoy tratando de averiguar si hay alguna diferencia en el rendimiento (o ventajas) cuando usamos nio FileChannel
frente a FileInputStream/FileOuputStream
normal para leer y escribir archivos en el sistema de archivos. Observé que en mi máquina ambos funcionan al mismo nivel, también muchas veces la forma FileChannel
es más lenta. ¿Puedo saber más detalles comparando estos dos métodos? Aquí está el código que utilicé, el archivo con el que estoy probando está alrededor de 350MB
. ¿Es una buena opción utilizar clases basadas en NIO para E/S de archivos si no estoy buscando acceso aleatorio u otras características avanzadas de este tipo?Java NIO FileChannel versus rendimiento/utilidad de FileOutputstream
package trialjavaprograms;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class JavaNIOTest {
public static void main(String[] args) throws Exception {
useNormalIO();
useFileChannel();
}
private static void useNormalIO() throws Exception {
File file = new File("/home/developer/test.iso");
File oFile = new File("/home/developer/test2");
long time1 = System.currentTimeMillis();
InputStream is = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(oFile);
byte[] buf = new byte[64 * 1024];
int len = 0;
while((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.flush();
fos.close();
is.close();
long time2 = System.currentTimeMillis();
System.out.println("Time taken: "+(time2-time1)+" ms");
}
private static void useFileChannel() throws Exception {
File file = new File("/home/developer/test.iso");
File oFile = new File("/home/developer/test2");
long time1 = System.currentTimeMillis();
FileInputStream is = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(oFile);
FileChannel f = is.getChannel();
FileChannel f2 = fos.getChannel();
ByteBuffer buf = ByteBuffer.allocateDirect(64 * 1024);
long len = 0;
while((len = f.read(buf)) != -1) {
buf.flip();
f2.write(buf);
buf.clear();
}
f2.close();
f.close();
long time2 = System.currentTimeMillis();
System.out.println("Time taken: "+(time2-time1)+" ms");
}
}
'transferTo' /' transferFrom' sería más convencional para copiar archivos. Cualquiera que sea la técnica no debe hacer que su disco duro sea más rápido o más lento, aunque supongo que podría haber un problema si lee pequeños trozos a la vez y hace que la cabeza pase una cantidad desorbitada de tiempo buscando. –
(No menciona qué sistema operativo está usando o qué proveedor y versión de JRE). –
Vaya, lo siento, estoy usando FC10 con Sun JDK6. – Keshav