เมนู

การคัดลอกไฟล์ Java (ง่ายและรวดเร็ว)

สารบัญ

การคัดลอกไฟล์ Java (ง่ายและรวดเร็ว)FileChannel#transferTo

ในภาษาจาวาคัดลอกไฟล์นี่คือโปรแกรมตัวอย่างที่แสดงให้เห็นถึงสิ่งนี้
โปรแกรมตัวอย่างนี้ใช้ New I/O ซึ่งถูกนำมาใช้ใน J2SE เวอร์ชัน 1.4 java.nio.channels.FileChannel#transferTo เราจะใช้วิธีนี้
วิธีนี้ช่วยให้คุณเขียนโปรแกรมคัดลอกได้โดยไม่ต้องกังวลเกี่ยวกับบัฟเฟอร์ที่จำเป็นในการอ่านข้อมูล ส่งผลให้ได้โค้ดที่ง่ายที่สุดเท่าที่จะเป็นไปได้

ช่องสัญญาณคืออะไร?

คำว่า "ช่องทาง" ถูกใช้ในความหมายที่หลากหลาย
โดยพื้นฐานแล้ว ดูเหมือนว่าจะหมายถึงเส้นทางการส่งผ่านข้อมูลสำหรับการรับและส่งข้อมูลระหว่างอุปกรณ์ต่างๆjava.nio.channels.FileChannel คลาสนี้แสดงถึงการเชื่อมต่อสำหรับการอ่านและเขียนไฟล์

โอนไปยัง วิธีนี้สามารถถ่ายโอนข้อมูลไบต์จากไฟล์ต้นทางไปยังช่องทางปลายทางได้

ต่อไปนี้เป็นข้อความที่คัดมาจากเอกสารประกอบการใช้งาน Java API

transferTo(long position, long count, WritableByteChannel target)
คำสั่งนี้จะถ่ายโอนไบต์จากไฟล์บนช่องทางนี้ไปยังช่องทางไบต์ที่สามารถเขียนได้ที่ระบุไว้
วิธีนี้อาจมีประสิทธิภาพมากกว่าการใช้ลูปแบบง่ายๆ ที่อ่านข้อมูลจากช่องทางนี้แล้วเขียนไปยังช่องทางเป้าหมาย ระบบปฏิบัติการหลายระบบสามารถถ่ายโอนไบต์โดยตรงจากแคชของระบบไฟล์ไปยังช่องทางเป้าหมายได้โดยไม่ต้องคัดลอกไบต์

ผลการตรวจสอบนี้แสดงให้เห็นว่า การใช้สตรีมปกติเป็นหนึ่งในวิธีการ
วิธีนี้ช่วยให้การคัดลอกเร็วกว่าวิธีอื่นๆ ที่ใช้ FileChannel (เช่น การใช้เมธอด ByteBuffer#allocateDirect)


ตัวอย่างโปรแกรม

การประหารชีวิต

เพื่อคัดลอกไฟล์โปรแกรมตัวอย่าง ฉันได้เตรียมไฟล์ขนาด 100MB ชื่อ "100M.txt" ไว้ในไดรฟ์ C โดยตรง
ในโปรแกรมตัวอย่าง... C:\100M.txt คัดลอกข้อความนี้ ซี:\อะ.txt สร้างไฟล์ต่อไปนี้

ตัวอย่างถูกรันในสภาพแวดล้อมดังต่อไปนี้
ระบบปฏิบัติการ: Windows XP
ซีพียู: Athlon 1.46GHz
หน่วยความจำ: 1GB
JRE: 1.6.4

◆ตัวอย่าง

/** * ตัวอย่างการเรียกใช้งาน * @param args */ public static void main(String[] args) { try { copyTransfer("C:\\100M.txt", "C:\\a.txt"); } catch (IOException e) { e.printStackTrace(); } }

◆ผลลัพธ์การดำเนินการ


 FileChannel#transferTo ในการดำเนินการคัดลอกโดยใช้วิธีการต่างๆ
กระบวนการคัดลอกไฟล์ขนาด 100MB เสร็จสิ้นในเวลาประมาณ 3 วินาที การใช้งานหน่วยความจำฮีปในระหว่างกระบวนการคัดลอกอยู่ที่ประมาณ 300 KB

อนึ่ง,การคัดลอกไฟล์ Java (เปลี่ยนขนาดบัฟเฟอร์)วิธีการที่อธิบายไว้ในนั้น
เมื่อกำหนดขนาดบัฟเฟอร์ที่มีประสิทธิภาพสูงสุดที่ 1000KB เวลาในการประมวลผลจะอยู่ที่ประมาณ 4 วินาที และการใช้หน่วยความจำฮีปจะอยู่ที่ประมาณ 1,300KB

แม้แต่การคัดลอกไฟล์แบบสตรีมมิ่งก็ยังสามารถเร่งความเร็วได้ด้วยการปรับขนาดบัฟเฟอร์
สำหรับการคัดลอกไฟล์เดียว วิธีการทั้งสองแบบนั้นแทบไม่มีความแตกต่างกันเลย
อย่างไรก็ตาม เมื่อคัดลอกไฟล์ขนาดใหญ่ทีละไฟล์ หรือดำเนินการคัดลอกหลายไฟล์พร้อมกัน FileChannel สามารถทำงานได้อย่างมีประสิทธิภาพในแง่ของความเร็วในการประมวลผลและการใช้หน่วยความจำฮีป

  • URL をkoピーしました!
สารบัญ