คัดลอกไฟล์ Java (เปลี่ยนขนาดบัฟเฟอร์)
ในประเทศชวา java.io.InputStream,java.io.OutputStream ที่
ขอแนะนำโปรแกรมตัวอย่างที่ดำเนินการคัดลอกโดยใช้สตรีมอินพุต/เอาท์พุต
ในการประมวลผลการคัดลอกโดยใช้สตรีม แม้แต่ไฟล์ขนาดใหญ่ก็สามารถคัดลอกได้ค่อนข้างรวดเร็วโดยการเพิ่มขนาดบัฟเฟอร์การอ่าน
ในโปรแกรมตัวอย่าง สามารถระบุขนาดบัฟเฟอร์การอ่านข้อมูลด้วยอาร์กิวเมนต์ได้
พื้นที่บัฟเฟอร์การอ่านที่ระบุได้รับการรักษาความปลอดภัยภายในฮีป JavaVM ดังนั้นการทำให้ใหญ่เกินไปจะส่งผลให้ประสิทธิภาพไม่ดี ดังนั้นเราจะตรวจสอบขนาดบัฟเฟอร์การอ่านข้อมูลที่มีประสิทธิภาพเมื่อทำการคัดลอกไฟล์
โปรแกรมตัวอย่าง
/**
* เขียนข้อมูลจากสตรีมอินพุตไปยังสตรีมเอาต์พุต
*สตรีมอินพุต/เอาท์พุตจะถูกปิดหลังจากกระบวนการคัดลอกเสร็จสิ้น
* @param ในสตรีมอินพุต
* @param os สตรีมเอาต์พุต
* @param bufferSize ขนาดบัฟเฟอร์การอ่านข้อมูล (KB)
* @throws IOException หากมีข้อยกเว้นในการประมวลผลอินพุต/เอาท์พุตเกิดขึ้น
*/
โมฆะสาธารณะคง copyStream (InputStream ใน, OutputStream os,
int bufferSize) พ่น IOException {
อินท์เลน = -1;
ไบต์ [] b = ไบต์ใหม่ [bufferSize * 1024];
พยายาม {
ในขณะที่ ((len = in.read(b, 0, b.length)) != -1) {
os.write(b, 0, len);
}
os.ฟลัช();
} ในที่สุด {
ถ้า (ใน != null) {
พยายาม {
ใน.ปิด();
} จับ (IOException จ) {
e.printStackTrace();
}
}
ถ้า (os != null) {
พยายาม {
os.ปิด();
} จับ (IOException จ) {
e.printStackTrace();
}
}
}
}
การดำเนินการ
ในการคัดลอกไฟล์โปรแกรมตัวอย่าง เราได้เตรียมไฟล์ขนาด 100MB "100M.txt" ไว้ใต้ไดรฟ์ C โดยตรง ในโปรแกรมตัวอย่าง C:\100M.txt อ่านข้อมูลเป็นหน่วยบัฟเฟอร์ขนาด 1000KB C:\a.txt คัดลอกไปที่
ตัวอย่างถูกดำเนินการในสภาพแวดล้อมต่อไปนี้
ระบบปฏิบัติการ: WindowsXP
ซีพียู: แอธลอน 1.46GHz
หน่วยความจำ: 1GB
เจอาร์อี: 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, 1,000KB และ 10,000KB มีการสรุปไว้ด้านล่าง
แม้ว่าจะไม่สามารถสรุปได้จากผลลัพธ์ข้างต้นเพียงอย่างเดียว หากคุณระบุขนาดบัฟเฟอร์การอ่านข้อมูลในหน่วย 1,000KB
ผลลัพธ์แสดงให้เห็นว่ามีประสิทธิภาพในแง่ของการใช้งานฮีปและเวลาในการประมวลผลระหว่างการประมวลผลการคัดลอก
ผลลัพธ์ที่คล้ายกันแม้จะเพิ่มขนาดไฟล์ (ประมาณ 1GB)
ในทางกลับกัน เมื่อคัดลอกไฟล์ขนาดเล็ก (ประมาณ 1MB หรือน้อยกว่า) การเพิ่มขนาดบัฟเฟอร์จะสิ้นเปลือง ดังนั้นผมคิดว่าควรระบุประมาณ 100KB จะดีกว่า
ใช้ FileChannel เพื่อความเร็วที่เร็วขึ้น
java.io.InputStream,java.io.OutputStream
การประมวลผลการคัดลอกเป็นสิ่งสำคัญในการทำความเข้าใจสตรีมอินพุต/เอาท์พุต
I/O ใหม่เปิดตัวใน J2SE1.4 java.nio.channels.FileChannel#transferTo
เมื่อใช้วิธีนี้ คุณจะสามารถคัดลอกไฟล์ได้อย่างมีประสิทธิภาพมากยิ่งขึ้น
ต่อไป ฉันจะแสดงวิธีการคัดลอกไฟล์อย่างง่ายดายและรวดเร็วโดยใช้ FileChannel
⇒ การคัดลอกไฟล์ Java (ง่ายและรวดเร็ว)