Saya mencoba mencari tahu apakah ada perbedaan kinerja (atau keuntungan) ketika kita menggunakan nio FileChannel
versus normal FileInputStream/FileOuputStream
untuk membaca dan menulis file ke sistem file. Saya mengamati bahwa pada mesin saya keduanya bekerja pada tingkat yang sama, juga berkali-kali FileChannel
jalannya lebih lambat. Bisakah saya tahu lebih detail membandingkan kedua metode ini. Berikut adalah kode yang saya gunakan, file yang saya uji ada di sekitar 350MB
. Apakah ini pilihan yang baik untuk menggunakan kelas berbasis NIO untuk File I / O, jika saya tidak melihat akses acak atau fitur canggih lainnya?
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
SayatransferFrom
akan lebih konvensional untuk menyalin file. Teknik mana pun yang tidak membuat hard drive Anda lebih cepat atau lebih lambat, meskipun saya kira mungkin ada masalah jika membaca potongan kecil pada suatu waktu dan menyebabkan kepala menghabiskan banyak waktu mencari.