การคัดลอกไฟล์ Java (เปลี่ยนขนาดบัฟเฟอร์)
ในภาษาจาวา java.io.InputStream、java.io.OutputStream ที่
ส่วนนี้จะนำเสนอโปรแกรมตัวอย่างที่ทำการคัดลอกข้อมูลโดยใช้สตรีมอินพุต/เอาต์พุต
ในการคัดลอกแบบสตรีม การเพิ่มขนาดบัฟเฟอร์การอ่านจะช่วยให้การคัดลอกทำได้เร็วขึ้น แม้แต่ไฟล์ขนาดใหญ่ก็ตาม
โปรแกรมตัวอย่างนี้อนุญาตให้คุณระบุขนาดบัฟเฟอร์การอ่านข้อมูลเป็นอาร์กิวเมนต์ได้
พื้นที่บัฟเฟอร์สำหรับการอ่านที่ระบุไว้จะถูกจัดสรรภายในฮีปของ Java VM ดังนั้นการกำหนดขนาดที่ใหญ่เกินไปจะลดประสิทธิภาพลง ด้วยเหตุนี้ เมื่อคัดลอกไฟล์ เราจึงต้องตรวจสอบขนาดบัฟเฟอร์สำหรับการอ่านข้อมูลที่เหมาะสมที่สุดด้วย
ตัวอย่างโปรแกรม
/**
* ข้อมูลจะถูกเขียนจากสตรีมอินพุตไปยังสตรีมเอาต์พุต
* หลังจากกระบวนการคัดลอกเสร็จสมบูรณ์แล้ว สตรีมอินพุตและเอาต์พุตจะถูกปิดลง
* @param ในสตรีมอินพุต
* @param os สตรีมเอาต์พุต
* @param bufferSize ขนาดของบัฟเฟอร์ (KB) สำหรับอ่านข้อมูล
* @throws IOException หากเกิดข้อผิดพลาดใดๆ ในการรับส่งข้อมูล
*/
public static void copyStream(InputStream in, OutputStream os,
int bufferSize) throws IOException {
ความยาวภายใน = -1;
byte[] b = new byte[bufferSize * 1024];
พยายาม {
while ((len = in.read(b, 0, b.length)) != -1) {
os.write(b, 0, len);
}
os.flush();
} ในที่สุด {
ถ้า (in != null) {
พยายาม {
ปิด();
} catch (IOException e) {
e.printStackTrace();
}
}
ถ้า os ไม่เป็นค่าว่าง {
พยายาม {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
การประหารชีวิต
เพื่อคัดลอกไฟล์โปรแกรมตัวอย่าง ฉันได้เตรียมไฟล์ขนาด 100MB ชื่อ "100M.txt" ไว้ในไดรฟ์ C โดยตรง ในโปรแกรมตัวอย่างนั้น C:\100M.txt ข้อมูลจะถูกอ่านในบัฟเฟอร์ขนาด 1000 กิโลไบต์ ซี:\อะ.txt คัดลอกไปยัง [ตำแหน่ง]
ตัวอย่างถูกรันในสภาพแวดล้อมดังต่อไปนี้
ระบบปฏิบัติการ: Windows XP
ซีพียู: Athlon 1.46GHz
หน่วยความจำ: 1GB
JRE: 1.6.4
◆ตัวอย่าง
/** * ตัวอย่างการเรียกใช้งาน * @param args */ public static void main(String[] args) { try { copyStream("C:\\100M.txt", "C:\\a.txt",1000); } catch (IOException e) { e.printStackTrace(); } }
การเปลี่ยนขนาดบัฟเฟอร์
ในการกำหนดขนาดบัฟเฟอร์การอ่านข้อมูลที่มีประสิทธิภาพเมื่อคัดลอกไฟล์ ควรตั้งค่าอาร์กิวเมนต์ที่สามของ copyStream เป็น
ผลลัพธ์ของการดำเนินการคัดลอกแบบเดียวกันในหน่วยขนาด 1KB, 100KB, 1000KB และ 10000KB สรุปได้ดังนี้

แม้ว่าเราจะไม่สามารถสรุปผลที่แน่ชัดได้จากผลลัพธ์ข้างต้นเพียงอย่างเดียว แต่หากระบุขนาดบัฟเฟอร์การอ่านข้อมูลเป็นหน่วย 1000KB
ผลการทดสอบแสดงให้เห็นว่าระบบมีประสิทธิภาพในแง่ของการใช้หน่วยความจำและเวลาในการประมวลผลระหว่างการดำเนินการคัดลอก
นอกจากนี้ ยังได้ผลลัพธ์ที่คล้ายคลึงกันแม้ว่าจะเพิ่มขนาดไฟล์ (เป็นประมาณ 1GB) ก็ตาม
ในทางกลับกัน เมื่อคัดลอกไฟล์ขนาดเล็ก (ประมาณ 1MB หรือน้อยกว่า) การเพิ่มขนาดบัฟเฟอร์นั้นไม่มีประโยชน์ ดังนั้นจึงควรเลือกขนาดบัฟเฟอร์ประมาณ 100KB จะดีที่สุด
ใช้ FileChannel เพื่อความเร็วที่เร็วขึ้น
java.io.InputStream、java.io.OutputStream
การคัดลอกมีความสำคัญต่อการทำความเข้าใจกระแสข้อมูลขาเข้า/ขาออก แต่
มีการเพิ่ม I/O ใหม่ใน J2SE1.4 java.nio.channels.FileChannel#transferTo
ด้วยวิธีการนี้ คุณสามารถคัดลอกไฟล์ได้อย่างมีประสิทธิภาพยิ่งขึ้น
ต่อไป ผมจะแสดงวิธีคัดลอกไฟล์อย่างง่ายและรวดเร็วโดยใช้ FileChannel ให้ดูครับ
⇒ การคัดลอกไฟล์ Java (ง่ายและรวดเร็ว)

