Archives pour février, 2010

Récupération de l’ancienne bannière

Utiliser Nio (1) – la copie de fichiers

Premier post traitant d’une possible longue série décrivant mes expérimentations autour du package java.nio.

Mon expérience me montre que le package java.nio est assez peu utilisé, souvent par méconnaissance. NIO étant réputé plus rapide que IO concernant la manipulation de gros fichiers, je vais tenter d’en faire l’expérience en Java SUN 1.6.

Première étape : la copie d’un fichier de 16.5 mo d’un endroit du filesystem vers un autre.

Version classique java.io :

 /**
 
* copy file to new target. If new target doesn't exist, it ll be created.
 
*
 
* @param source
 
*            sourceFile
 
* @param target
 
*            target file
 
* @throws IOException
 
*             exception
 
*/
 
public static void copyFile(final File source, final File target)
 
throws IOException {
 
FileInputStream fis = null;
 
FileOutputStream fos = null;
 
try {
 
if (!target.exists()) {
 
target.createNewFile();
 
}
 
fis = new java.io.FileInputStream(source);
 
fos = new java.io.FileOutputStream(target);
 
final byte buffer[] = new byte[256 * 1024];  // 256Ko
 
int nbLecture;
 
while ((nbLecture = fis.read(buffer)) != -1) {
 
fos.write(buffer, 0, nbLecture);
 
}
 
} finally {
 
fis.close();
 
fos.close();
 
}
 
}

Version java.nio :

/**
 
* copy file to new target. If new target doesn't exists, it ll be created.
 
*
 
* @param source
 
*            sourceFile
 
* @param target
 
*            target file
 
* @throws IOException
 
*             exception
 
*/
 
public static void copyFile(final File source, final File target)
 
throws IOException {
 
if (!target.exists()) {
 
target.createNewFile();
 
}
 
FileChannel fileChannel = null;
 
FileChannel destination = null;
 
try {
 
fileChannel = new FileInputStream(source).getChannel();
 
destination = new FileOutputStream(target).getChannel();
 
destination.transferFrom(fileChannel, 0, fileChannel.size());
 
} finally {
 
if (fileChannel != null) {
 
fileChannel.close();
 
}
 
if (destination != null) {
 
destination.close();
 
}
 
}
 
}

Performances du disque dur

Performance Specifications

Rotational Speed 7,200 RPM (nominal)

Buffer Size 16 MB

Average Latency 5.50 ms (nominal)

Seek Times

Read Seek Time 12.0 ms

Track-To-Track Seek Time 2.0 ms (average)

Transfer Rates

Buffer To Host (Serial ATA) 3 Gb/s (Max)

Résultats :

A suivre…

Liens :

http://stackoverflow.com/questions/1605332/java-nio-filechannel-versus-fileoutputstream-performance-usefulness

http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/FileChannel.html#transferTo(long,%20long,%20java.nio.channels.WritableByteChannel)

Haut de Page