Tôi đang cố gắng tìm hiểu xem có sự khác biệt nào về hiệu suất (hoặc lợi thế) khi chúng ta sử dụng nio FileChannel
so với bình thường FileInputStream/FileOuputStream
để đọc và ghi tệp vào hệ thống tệp. Tôi quan sát thấy rằng trên máy của tôi cả hai thực hiện ở cùng một cấp độ, cũng nhiều lần FileChannel
cách chậm hơn. Tôi có thể vui lòng biết thêm chi tiết so sánh hai phương pháp này. Đây là mã tôi đã sử dụng, tập tin mà tôi đang kiểm tra có ở xung quanh 350MB
. Đây có phải là một lựa chọn tốt để sử dụng các lớp dựa trên NIO cho Tệp I / O không, nếu tôi không tìm kiếm quyền truy cập ngẫu nhiên hoặc các tính năng nâng cao khác như vậy?
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
sẽ là thông thường hơn để sao chép các tập tin. Bất cứ kỹ thuật nào cũng không nên làm cho ổ cứng của bạn nhanh hơn hay chậm hơn, mặc dù tôi đoán có thể có vấn đề nếu nó đọc các đoạn nhỏ tại một thời điểm và khiến đầu mất nhiều thời gian tìm kiếm.