Ich versuche herauszufinden, ob es einen Unterschied in der Leistung (oder den Vorteilen) gibt, wenn wir nio im FileChannel
Vergleich zu normal verwenden FileInputStream/FileOuputStream
, um Dateien in das Dateisystem zu lesen und zu schreiben. Ich habe festgestellt, dass beide auf meiner Maschine auf dem gleichen Niveau arbeiten, auch um ein Vielfaches FileChannel
langsamer. Kann ich bitte weitere Einzelheiten zum Vergleich dieser beiden Methoden erfahren? Hier ist der Code, den ich verwendet habe. Die Datei, mit der ich teste, ist in der Nähe 350MB
. Ist es eine gute Option, NIO-basierte Klassen für Datei-E / A zu verwenden, wenn ich keinen Direktzugriff oder andere solche erweiterten Funktionen betrachte?
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
IchtransferFrom
wäre konventioneller zum Kopieren von Dateien. Welche Technik auch immer Ihre Festplatte nicht schneller oder langsamer machen sollte, obwohl ich denke, dass es ein Problem geben könnte, wenn sie kleine Stücke gleichzeitig liest und den Kopf übermäßig viel Zeit damit verbringt, zu suchen.