Sao chép tệp Java (dễ dàng và nhanh chóng)FileChannel#transferTo
Trong Javasao chép tập tinGiới thiệu một chương trình mẫu để thực hiện việc này.
Chương trình mẫu dựa trên I/O mới được giới thiệu trong J2SE1.4. java.nio.channels.FileChannel#transferTo phương pháp.
Bạn có thể viết chương trình xử lý sao chép mà không cần lo lắng về bộ đệm cần thiết để đọc dữ liệu, đây là phương pháp mã hóa đơn giản nhất.
Kênh là gì?
Kênh từ được sử dụng theo nhiều cách khác nhau.
Về cơ bản, nó dường như chỉ ra đường truyền để nhập và xuất dữ liệu giữa các thiết bị khác.java.nio.channels.FileChannel là một lớp đại diện cho một kết nối để đọc và ghi vào tập tin.
chuyển tới Một phương thức có thể chuyển byte từ tệp nguồn sang kênh đích.
Sau đây được trích dẫn từ tài liệu JavaAPI.
transferTo(vị trí dài, số lượng dài, mục tiêu WritableByteChannel)
Chuyển byte từ tệp của kênh này sang kênh byte có thể ghi được chỉ định.
Phương pháp này có thể 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 nó vào kênh đích. Nhiều hệ điều hành có thể chuyển byte trực tiếp từ bộ đệm của hệ thống tệp sang kênh đích. Tại thời điểm này, không có byte nào được sao chép.
Kết quả xác minh này cho thấy cách sử dụng luồng thông thường,
Quá trình sao chép nhanh hơn các phương pháp FileChannel khác (chẳng hạn như sử dụng phương pháp ByteBuffer#allocateDirect).
chương trình mẫu
FileChannel srcChannel = mới
FileInputStream(srcPath).getChannel();
FileChannel DestChannel = mới
FileOutputStream(destPath).getChannel();
thử {
srcChannel.transferTo(0, srcChannel.size(), DestChannel);
} Cuối cùng {
srcChannel.close();
destChannel.close();
}
}
chấp hành
Để sao chép tệp chương trình mẫu, chúng tôi đã chuẩn bị tệp 100 MB "100M.txt" ngay trong ổ C.
Trong chương trình mẫu C:\100M.txt bằng cách sao chép C:\a.txt Tạo một tập tin.
Mẫu được thực hiện trong môi trường sau.
Hệ điều hành: WindowsXP
CPU: Athlon 1.46GHz
Bộ nhớ: 1GB
JRE: 1.6.4
◆Ví dụ thực thi
/** * 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 xử lý sao chép bằng phương pháp
Sao chép một tập tin 100 MB được hoàn thành trong khoảng 3 giây. Ngoài ra, mức sử dụng heap trong quá trình sao chép là khoảng 300 (KB).
Nhân tiện,Sao chép tệp Java (thay đổi kích thước bộ đệm)Trong phương pháp được giới thiệu ở
Khi chúng tôi chỉ định kích thước bộ đệm hiệu quả nhất là 1000KB, thời gian xử lý là khoảng 4 giây và mức sử dụng heap là khoảng 1.300KB.
Ngay cả việc sao chép tệp theo luồng cũng có thể được tăng tốc bằng cách điều chỉnh kích thước bộ đệm, do đó
Có thể nói rằng không có nhiều khác biệt trong quá trình sao chép một tập tin.
Tuy nhiên, khi sao chép các tệp lớn liên tục hoặc thực hiện song song nhiều quá trình sao chép, FileChannel có thể hiệu quả về tốc độ xử lý và mức sử dụng heap.