Sao chép tập tin Java (dễ dàng và nhanh chóng)FileChannel#transferTo
Trong JavaSao chép tệpDưới đây là một chương trình mẫu minh họa điều này.
Chương trình mẫu sử dụng New I/O, được giới thiệu trong J2SE 1.4. java.nio.channels.FileChannel#transferTo Chúng ta sẽ sử dụng phương pháp này.
Điều này cho phép bạn viết chương trình sao chép mà không cần phải lo lắng về các bộ đệm cần thiết để đọc dữ liệu, dẫn đến việc lập trình đơn giản nhất có thể.
Kênh là gì?
Từ "kênh" được sử dụng theo nhiều cách khác nhau,
Về cơ bản, thuật ngữ này dường như đề cập đến đường truyền dữ liệu đầu vào và đầu ra giữa các thiết bị khác nhau.java.nio.channels.FileChannel Lớp này đại diện cho một kết nối để đọc và ghi dữ liệu vào các tập tin.
chuyển tới Phương pháp này có thể truyền dữ liệu byte từ tệp nguồn đến kênh đích.
Đoạn văn sau đây được trích dẫn từ tài liệu API của Java.
transferTo(long position, long count, WritableByteChannel target)
Lệnh này chuyển các byte từ tệp trên kênh này sang kênh byte có thể ghi được chỉ định.
Phương pháp này có khả năng hiệu quả hơn nhiều so với một vòng lặp đơn giản đọc dữ liệu từ kênh này và ghi vào kênh đích. Nhiều hệ điều hành có thể truyền trực tiếp các byte từ bộ nhớ đệm của hệ thống tệp đến kênh đích mà không cần sao chép các byte.
Kết quả của quá trình xác minh này cho thấy rằng sử dụng luồng thông thường là một phương pháp.
Phương pháp này cho phép sao chép nhanh hơn so với các phương pháp khác sử dụng FileChannel (chẳng hạn như sử dụng phương pháp ByteBuffer#allocateDirect).
Chương trình mẫu
FileChannel srcChannel = new
FileInputStream(srcPath).getChannel();
FileChannel destChannel = new
FileOutputStream(destPath).getChannel();
thử {
srcChannel.transferTo(0, srcChannel.size(), destChannel);
} Cuối cùng {
srcChannel.close();
destChannel.close();
}
}
thực thi
Để sao chép các tập tin chương trình mẫu, tôi đã chuẩn bị một tập tin có dung lượng 100MB mang tên "100M.txt" đặt trực tiếp trong ổ C.
Trong chương trình mẫu... C:\100M.txt Sao chép và C:\a.txt Hãy tạo tập tin sau.
Mẫu được chạy trong môi trường sau đây.
Hệ điều hành: Windows XP
CPU: Athlon 1.46GHz
Bộ nhớ: 1GB
JRE: 1.6.4
◆Ví dụ
/** * Ví dụ thực thi * @param args */ public static void main(String[] args) { try { copyTransfer("C:\\100M.txt", "C:\\a.txt"); } catch (IOException e) { e.printStackTrace(); } }
FileChannel#transferTo Trong các thao tác sao chép sử dụng các phương pháp
Quá trình sao chép một tập tin 100MB hoàn tất trong khoảng 3 giây. Dung lượng bộ nhớ heap được sử dụng trong quá trình sao chép cũng vào khoảng 300 KB.
Nhân tiện,Sao chép tập tin Java (thay đổi kích thước bộ đệm)Phương pháp được mô tả ở đó,
Khi thiết lập kích thước bộ đệm hiệu quả nhất là 1000KB, thời gian xử lý xấp xỉ 4 giây và mức sử dụng bộ nhớ heap là khoảng 1300KB.
Ngay cả với phương pháp sao chép tập tin dựa trên luồng, quá trình này vẫn có thể được tăng tốc bằng cách điều chỉnh kích thước bộ đệm.
Đối với quá trình sao chép một tập tin duy nhất, không có nhiều khác biệt giữa hai phương pháp này.
Tuy nhiên, khi sao chép các tập tin lớn theo trình tự hoặc thực hiện nhiều thao tác sao chép song song, FileChannel có thể hiệu quả về tốc độ xử lý và mức sử dụng bộ nhớ heap.

