J'essaie de comprendre s'il y a une différence de performance (ou avantages) lorsque nous utilisons nio FileChannel
par rapport à la normale FileInputStream/FileOuputStream
pour lire et écrire des fichiers sur le système de fichiers. J'ai observé que sur ma machine les deux fonctionnent au même niveau, aussi plusieurs fois le FileChannel
est plus lent. Puis-je connaître plus de détails en comparant ces deux méthodes. Voici le code que j'ai utilisé, le fichier que je suis en train de tester est autour de 350MB
. Est-ce une bonne option d'utiliser des classes basées sur NIO pour les E/S de fichiers, si je ne regarde pas l'accès aléatoire ou d'autres fonctionnalités avancées?Java NIO FileChannel par rapport à FileOutputstream performance/utilité
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' serait plus classique pour copier des fichiers. Quelle que soit la technique ne devrait pas rendre votre disque dur plus rapide ou plus lent, même si je suppose qu'il pourrait y avoir un problème si elle lit de petits morceaux à la fois et provoque la tête de passer un temps excessif à chercher. –
(Vous ne mentionnez pas le système d'exploitation que vous utilisez ou le fournisseur et la version de JRE.) –
Désolé, j'utilise FC10 avec Sun JDK6. – Keshav