Java รับขนาดไฟล์
วันนี้เมื่อเขียนโค้ดคุณต้องใช้ฟังก์ชั่นการรับขนาดไฟล์ ขณะนี้มีวิธีการใช้งานสองวิธี หนึ่งคือการใช้วิธีความยาวของไฟล์ (); อีกวิธีหนึ่งคือการใช้วิธีการที่มีอยู่ () ของ FileInputStream เมื่อ InputStream ไม่ดำเนินการอ่านขนาดของ arable () ควรเท่ากับขนาดไฟล์ แต่เมื่อจัดการกับไฟล์ขนาดใหญ่ปัญหาจะเกิดขึ้นในช่วงหลัง มาดูกันเถอะ:
ในตัวอย่างฉันใช้ไฟล์ภาพการติดตั้งของ CentOS 6.5 โดยส่วนใหญ่พิจารณาว่าไฟล์นี้มีขนาดใหญ่พอ (มีขนาดใหญ่กว่า 2GB)
1. ใช้วิธีความยาวของไฟล์ ()
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ไฟล์ f = ไฟล์ใหม่ ("d: //centos-6.5-x86_64-bin-dvd1.iso"); if (f.exists () && f.isfile ()) {logger.info (f.length ()); } else {logger.info ("ไฟล์ไม่มีอยู่หรือไม่ใช่ไฟล์"); -มาดูผลลัพธ์:
4467982336
ผลลัพธ์คือ 4.16GB ซึ่งสอดคล้องกับผลลัพธ์ที่แสดงบน Windows
ถัดไปลองดูที่ขนาดไฟล์ที่ได้รับผ่าน FileInputStream:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {fileInputStream fis = null; ลอง {ไฟล์ f = ไฟล์ใหม่ ("d: //centos-6.5-x86_64-bin-dvd1.iso"); FIS = ใหม่ FileInputStream (F); logger.info (fis.available ()); } catch (exception e) {logger.error (e); } ในที่สุด {ถ้า (null! = fis) {ลอง {fis.close (); } catch (ioexception e) {logger.error (e); -นี่คือผลการทำงาน:
2147483647
ผลลัพธ์นี้ดูคุ้นเคยหรือไม่? มันเป็นจำนวนเต็ม max_value ซึ่งเป็นค่าสูงสุดที่จำนวนเต็มที่ลงนามสามารถเป็นตัวแทนได้
ดังนั้นหากคุณแปลงเป็นหน่วยที่คุ้นเคยขนาดไฟล์ที่ได้รับในลักษณะนี้มีขนาดใหญ่แค่ไหน?
ประมาณ 2GB ซึ่งเห็นได้ชัดว่าไม่ใช่ผลลัพธ์ที่ถูกต้อง
เหตุผลก็คือประเภทที่ส่งคืนโดยวิธีความยาว () ของไฟล์มีความยาวและค่าสูงสุดของค่าบวกที่ประเภทยาวสามารถแสดงได้คือ: 9223372036854775807 ขนาดไฟล์สูงสุดที่สามารถแปลงเป็นการสนับสนุนสูงสุดคือ: 8954730132868714 EB BYTES ลำดับความสำคัญนี้จะถูกใช้เป็นเวลาหลายปีในประวัติศาสตร์ของการพัฒนาไอทีของมนุษย์ ค่าส่งคืนของวิธีการที่มีอยู่ () ของ FileInputStream คือ int ช่วงการเป็นตัวแทนสูงสุดก่อนหน้านี้ ขนาดไฟล์สูงสุดที่สามารถรองรับได้คือ: 1.99GB และเราสามารถเข้าถึงลำดับขนาดนี้ได้อย่างง่ายดาย
เพิ่มเมื่อวันที่ 31 มีนาคม 2014:
เป็นไปไม่ได้ที่จะอ่านขนาดไฟล์ขนาดใหญ่สำหรับวิธีการสตรีม แต่คุณไม่สามารถใช้แพ็คเกจแบบดั้งเดิมภายใต้ java.io* ที่นี่คุณต้องใช้เครื่องมือใหม่ภายใต้ java.nio.* - FileChannel มาดูรหัสตัวอย่างต่อไปนี้:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {fileChannel fc = null; ลอง {ไฟล์ f = ไฟล์ใหม่ ("d: //centos-6.5-x86_64-bin-dvd1.iso"); if (f.exists () && f.isfile ()) {fileInputStream fis = new FileInputStream (f); fc = fis.getChannel (); logger.info (fc.size ()); } else {logger.info ("ไฟล์ไม่มีอยู่หรือไม่ใช่ไฟล์"); }} catch (filenotfoundException e) {logger.error (e); } catch (ioexception e) {logger.error (e); } ในที่สุด {ถ้า (null! = fc)) {ลอง {fc.close (); } catch (ioexception e) {logger.error (e); -ผลลัพธ์ที่ได้รับหลังจากใช้ filechannel สอดคล้องกับกรณีแรกโดยอธิบายขนาดที่แน่นอนของไฟล์ได้อย่างแม่นยำ
สิ่งนี้ยังเตือนเพื่อนร่วมงานด้านเทคนิคทั้งหมดว่าเมื่ออ่านไฟล์ขนาดใหญ่คุณต้องระมัดระวังเกี่ยวกับข้อมูลประเภท INT เพื่อหลีกเลี่ยงข้อบกพร่องที่ซ่อนอยู่และเป็นการยากที่จะค้นหา
ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!