Java mendapatkan ukuran file
Hari ini, saat menulis kode, Anda perlu mengimplementasikan fungsi mendapatkan ukuran file. Saat ini ada dua metode implementasi. Salah satunya adalah menggunakan metode panjang file (); Yang lainnya adalah menggunakan metode FileInputStream (). Ketika InputStream tidak melakukan operasi baca, ukuran yang tersedia () harus sama dengan ukuran file. Tetapi ketika berhadapan dengan file besar, masalah terjadi pada yang terakhir. Mari kita lihat:
Dalam contoh, saya menggunakan file gambar instalasi CentOS 6.5, terutama mengingat bahwa file ini cukup besar (besar dari 2GB).
1. Gunakan metode panjang file ()
public static void main (string [] args) {file f = file baru ("d: //centos-6.5-x86_64-bin-dvd1.iso"); if (f.exists () && f.isfile ()) {logger.info (f.length ()); } else {logger.info ("File tidak ada atau bukan file"); }}Mari kita lihat outputnya:
4467982336
Hasilnya adalah 4.16GB, yang konsisten dengan hasil yang ditampilkan pada Windows.
Selanjutnya, mari kita lihat ukuran file yang diperoleh melalui FileInputStream:
public static void main (string [] args) {fileInputStream fis = null; coba {file f = file baru ("d: //centos-6.5-x86_64-Bin-dvd1.iso"); fis = FileInputStream baru (f); logger.info (fis.available ()); } catch (Exception e) {logger.error (e); } akhirnya {if (null! = fis) {coba {fis.close (); } catch (ioException e) {logger.error (e); }}}}}Berikut hasil berjalan:
2147483647
Apakah hasil ini terlihat akrab? Ini adalah integer.max_value, yang merupakan nilai maksimum yang dapat diwakili oleh integer yang ditandatangani.
Jadi, jika Anda mengubahnya menjadi unit yang akrab, seberapa besar ukuran file yang diperoleh dengan cara ini?
Ini sekitar 2GB, yang jelas bukan hasil yang benar.
Alasannya adalah bahwa tipe yang dikembalikan dengan panjang () metode file panjang, dan nilai maksimum dari nilai positif yang dapat diwakili oleh tipe panjang adalah: 9223372036854775807. Ukuran file maksimum yang dapat dikonversi menjadi dukungan maksimum adalah: 8954730132868714 EB Bytes EB. Urutan besarnya ini akan digunakan selama bertahun -tahun dalam sejarah perkembangan TI manusia. Nilai pengembalian metode FileInputStream () adalah int. Kisaran representasi maksimum diperkenalkan sebelumnya. Ukuran file maksimum yang dapat didukung adalah: 1.99GB, dan kami dapat dengan mudah mencapai urutan besarnya.
Ditambahkan pada 31 Maret 2014:
Tidak layak untuk membaca ukuran file besar untuk metode streaming, tetapi Anda tidak dapat lagi menggunakan paket tradisional di bawah java.io.*. Di sini Anda perlu menggunakan alat baru di bawah java.nio.* - FileChannel. Mari kita lihat kode sampel berikut:
public static void main (string [] args) {filechannel fc = null; coba {file f = file baru ("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 ("File tidak ada atau bukan file"); }} catch (FileNotFoundException e) {logger.error (e); } catch (ioException e) {logger.error (e); } akhirnya {if (null! = fc)) {coba {fc.close (); } catch (ioException e) {logger.error (e); }}}}}Hasil yang diperoleh setelah menggunakan filechannel konsisten dengan kasus pertama, secara akurat menggambarkan ukuran yang tepat dari file.
Ini juga mengingatkan semua kolega teknis bahwa ketika membaca file besar, Anda harus berhati-hati tentang data tipe-tip untuk menghindari bug tersembunyi dan sulit untuk menemukannya.
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!