Dosya sistemine dosya okumak ve yazmak için nio'ya FileChannel
karşı nio kullandığımızda performansta (veya avantajlarda) herhangi bir fark olup olmadığını anlamaya çalışıyorum FileInputStream/FileOuputStream
. Makinemde hem aynı seviyede hem de FileChannel
yolun daha yavaş çalıştığını gözlemledim . Bu iki yöntemi karşılaştırarak daha fazla ayrıntı öğrenebilir miyim? İşte kullandığım kod, test ettiğim dosya etrafında 350MB
. Rastgele erişime veya diğer gelişmiş özelliklere bakmıyorsam Dosya G / Ç için NIO tabanlı sınıfları kullanmak iyi bir seçenek mi?
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
dosyaları kopyalamak için daha geleneksel olurdu. Hangi teknik sabit sürücünüzü daha hızlı veya daha yavaş yapmamalıdır, ancak bir seferde küçük parçaları okur ve kafanın arama yapmak için aşırı miktarda zaman harcamasına neden olursa bir sorun olabilir.