Próbuję dowiedzieć się, czy jest jakaś różnica w wydajności (lub zaletach), gdy używamy nio w FileChannel
porównaniu z normalnym FileInputStream/FileOuputStream
do odczytu i zapisu plików w systemie plików. Zauważyłem, że na moim komputerze oba działają na tym samym poziomie, również wielokrotnie FileChannel
droga jest wolniejsza. Czy mogę poznać więcej szczegółów porównujących te dwie metody. Oto kod, którego użyłem, plik, z którym testuję, jest w pobliżu 350MB
. Czy dobrym rozwiązaniem jest używanie klas opartych na NIO do wejścia / wyjścia plików, jeśli nie patrzę na dostęp losowy lub inne takie zaawansowane funkcje?
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
byłoby bardziej konwencjonalne przy kopiowaniu plików. Niezależnie od tego, która technika nie powinna przyspieszyć ani zwolnić dysku twardego, chociaż myślę, że może wystąpić problem, jeśli odczytuje małe fragmenty na raz i powoduje, że głowa spędza nadmierną ilość czasu na szukaniu.