การคัดลอกไฟล์ Java (ง่ายและรวดเร็ว)FileChannel#โอนไปยัง
ในประเทศชวาคัดลอกไฟล์แนะนำโปรแกรมตัวอย่างเพื่อทำสิ่งนี้
โปรแกรมตัวอย่างอิงตาม New I/O ที่นำมาใช้ใน J2SE1.4 java.nio.channels.FileChannel#transferTo วิธี.
คุณสามารถเขียนโปรแกรมประมวลผลสำเนาได้โดยไม่ต้องกังวลกับบัฟเฟอร์ที่จำเป็นในการอ่านข้อมูล ทำให้เป็นวิธีการเข้ารหัสที่ง่ายที่สุด
ช่องคืออะไร?
คำว่า channel ถูกใช้ในรูปแบบต่างๆ มากมาย
โดยพื้นฐานแล้วดูเหมือนว่าจะระบุเส้นทางการส่งข้อมูลสำหรับการป้อนข้อมูลและการส่งออกระหว่างอุปกรณ์อื่น ๆjava.nio.channels.FileChannel เป็นคลาสที่แสดงถึงการเชื่อมต่อสำหรับการอ่านและการเขียนไฟล์
โอนไปยัง วิธีการสามารถถ่ายโอนไบต์จากไฟล์ต้นทางไปยังช่องปลายทาง
ข้อมูลต่อไปนี้อ้างอิงจากเอกสาร JavaAPI
TransferTo (ตำแหน่งยาว, จำนวนยาว, เป้าหมาย WritableByteChannel)
ถ่ายโอนไบต์จากไฟล์ของช่องนี้ไปยังช่องไบต์ที่เขียนได้ที่ระบุ
วิธีนี้จะมีประสิทธิภาพมากกว่าการวนซ้ำแบบธรรมดาที่อ่านข้อมูลจากช่องนี้และเขียนลงในช่องเป้าหมาย ระบบปฏิบัติการหลายระบบสามารถถ่ายโอนไบต์ได้โดยตรงจากแคชของระบบไฟล์ไปยังช่องสัญญาณเป้าหมาย ในขณะนี้ จะไม่มีการคัดลอกไบต์
ผลการตรวจสอบนี้แสดงวิธีการใช้สตรีมปกติ
กระบวนการคัดลอกเร็วกว่าวิธี FileChannel อื่นๆ (เช่น การใช้วิธี ByteBuffer#allocateDirect)
โปรแกรมตัวอย่าง
FileChannel srcChannel = ใหม่
FileInputStream(srcPath).getChannel();
FileChannel destChannel = ใหม่
FileOutputStream(destPath).getChannel();
พยายาม {
srcChannel.transferTo(0, srcChannel.size(), destChannel);
} ในที่สุด {
srcChannel.ปิด();
destChannel.close();
}
}
การดำเนินการ
ในการคัดลอกไฟล์โปรแกรมตัวอย่าง เราได้เตรียมไฟล์ขนาด 100MB "100M.txt" ไว้ใต้ไดรฟ์ C โดยตรง
ในโปรแกรมตัวอย่าง C:\100M.txt โดยการคัดลอก C:\a.txt สร้างไฟล์.
ตัวอย่างถูกดำเนินการในสภาพแวดล้อมต่อไปนี้
ระบบปฏิบัติการ: WindowsXP
ซีพียู: แอธลอน 1.46GHz
หน่วยความจำ: 1GB
เจอาร์อี: 1.6.4
◆ตัวอย่างการดำเนินการ
/** * ตัวอย่างการดำเนินการ * @param args */ public static void main(String[] args) { try { copyTransfer("C:\\100M.txt", "C:\\a.txt"); } catch (IOException จ) { e.printStackTrace(); } }
FileChannel#โอนไปยัง ในการประมวลผลการคัดลอกโดยใช้วิธีการ
การคัดลอกไฟล์ขนาด 100MB เสร็จสิ้นในเวลาประมาณ 3 วินาที นอกจากนี้ การใช้งานฮีประหว่างกระบวนการคัดลอกก็ประมาณ 300 (KB)
อนึ่ง,คัดลอกไฟล์ Java (เปลี่ยนขนาดบัฟเฟอร์)โดยวิธีการที่ได้แนะนำมานั้น
เมื่อเราระบุขนาดบัฟเฟอร์ที่มีประสิทธิภาพสูงสุดที่ 1,000KB เวลาในการประมวลผลจะอยู่ที่ประมาณ 4 วินาที และการใช้งานฮีปจะอยู่ที่ประมาณ 1,300KB
แม้แต่การคัดลอกไฟล์ด้วยสตรีมก็สามารถเร่งความเร็วได้ด้วยการปรับขนาดบัฟเฟอร์เช่นกัน
อาจกล่าวได้ว่ากระบวนการคัดลอกไฟล์เดียวไม่แตกต่างกันมากนัก
อย่างไรก็ตาม เมื่อคัดลอกไฟล์ขนาดใหญ่อย่างต่อเนื่องหรือดำเนินการกระบวนการคัดลอกหลายรายการพร้อมกัน FileChannel จะมีประสิทธิภาพในแง่ของความเร็วในการประมวลผลและการใช้งานฮีป