Ich versuche herauszufinden, ob es einen Unterschied in der Leistung (oder Vorteile) gibt, wenn wir nio FileChannel
gegenüber normalen FileInputStream/FileOuputStream
verwenden, um Dateien in Dateisystem zu lesen und zu schreiben. Ich habe beobachtet, dass auf meiner Maschine beide auf dem gleichen Niveau, auch oft die FileChannel
Weg ist langsamer. Kann ich bitte mehr Details im Vergleich dieser beiden Methoden wissen. Hier ist der Code, den ich verwendet habe, die Datei, mit der ich versuche, ist um 350MB
. Ist es eine gute Option, NIO-basierte Klassen für Datei-I/O zu verwenden, wenn ich nicht auf den wahlfreien Zugriff oder andere solche erweiterten Funktionen schaue?Java NIO FileChannel versus FileOutputstream Leistung/Nützlichkeit
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' würde für das Kopieren von Dateien konventionelleren sein. Welche Technik auch immer Ihre Festplatte nicht schneller oder langsamer machen sollte, obwohl ich denke, dass es ein Problem sein könnte, wenn es kleine Stücke gleichzeitig liest und den Kopf dazu veranlasst, eine übermäßige Menge an Zeit zu verbringen. –
(Sie erwähnen nicht, welches Betriebssystem Sie verwenden oder welchen JRE-Hersteller und welche JRE-Version.) –
Hoppla, ich verwende FC10 mit Sun JDK6. – Keshav