Bagaimana cara mengambil ukuran folder atau file di Java?
java
filesystems
oneat
sumber
sumber
StatFs
. Ini menggunakan statistik sistem file dan hampir 1000x lebih cepat daripada metode rekursif, yang tidak dapat digunakan untuk kebutuhan kita. Implementasi kami dapat ditemukan di sini: stackoverflow.com/a/58418639/293280Jawaban:
Ini mengembalikan panjang file dalam byte atau
0
jika file tidak ada. Tidak ada cara bawaan untuk mendapatkan ukuran folder, Anda harus berjalan di pohon direktori secara rekursif (menggunakanlistFiles()
metode objek file yang mewakili direktori) dan mengakumulasi ukuran direktori untuk Anda sendiri:PERINGATAN : Metode ini tidak cukup kuat untuk penggunaan produksi.
directory.listFiles()
dapat kembalinull
dan menyebabkan aNullPointerException
. Juga, itu tidak mempertimbangkan symlink dan mungkin memiliki mode kegagalan lain. Gunakan metode ini .sumber
NullPointerException
jika direktori dimodifikasi secara bersamaan.Menggunakan java-7 nio api, menghitung ukuran folder bisa dilakukan lebih cepat.
Berikut adalah contoh siap dijalankan yang kuat dan tidak akan mengeluarkan pengecualian. Ini akan mencatat direktori yang tidak dapat dimasuki atau mengalami masalah saat menjelajah. Symlinks diabaikan, dan modifikasi direktori secara bersamaan tidak akan menyebabkan lebih banyak masalah daripada yang diperlukan.
sumber
AtomicLong
bukan hanyalong
?Files
sekali tidak mendukungnya secara langsung!Anda membutuhkan
FileUtils#sizeOfDirectory(File)
dari commons-io .Perhatikan bahwa Anda perlu memeriksa secara manual apakah file tersebut adalah direktori karena metode ini mengeluarkan pengecualian jika non-direktori diteruskan ke sana.
PERINGATAN : Metode ini (seperti pada commons-io 2.4) memiliki bug dan mungkin muncul
IllegalArgumentException
jika direktori diubah secara bersamaan.sumber
checkDirectory(directory);
pemeriksaan. Pastikan saja yangFile.listFiles
memiliki anak. Referensi : FileUtils.sizeOfDirectory () , File.listFiles ()IllegalArgumentException
jika direktori diubah saat iterasi.Di Jawa 8:
Ini akan lebih baik untuk digunakan
Files::size
dalam langkah peta tetapi ini memunculkan pengecualian yang dicentang.UPDATE:
Anda juga harus menyadari bahwa ini dapat menimbulkan pengecualian jika beberapa file / folder tidak dapat diakses. Lihat pertanyaan ini dan solusi lain menggunakan Jambu Biji .
sumber
sumber
size += getFolderSize(file);
Untuk Java 8 ini adalah salah satu cara yang tepat untuk melakukannya:
Penting untuk memfilter semua direktori , karena metode panjang tidak dijamin 0 untuk direktori.
Setidaknya kode ini memberikan informasi ukuran yang sama seperti yang dilakukan Windows Explorer itu sendiri.
sumber
Berikut cara terbaik untuk mendapatkan ukuran File umum (berfungsi untuk direktori dan non-direktori):
Sunting: Perhatikan bahwa ini mungkin akan menjadi operasi yang memakan waktu. Jangan menjalankannya di thread UI.
Selain itu, di sini (diambil dari https://stackoverflow.com/a/5599842/1696171 ) adalah cara yang bagus untuk mendapatkan String yang dapat dibaca pengguna dari yang sudah lama dikembalikan:
sumber
Jika Anda ingin menggunakan Java 8 NIO API, program berikut akan mencetak ukuran, dalam byte, dari direktori tempatnya berada.
The
calculateSize
metode adalah universal untukPath
objek, sehingga ia juga bekerja untuk file. Perhatikan bahwa jika file atau direktori tidak dapat diakses, dalam hal ini ukuran yang dikembalikan dari objek jalur adalah0
.sumber
File.length()
( Javadoc ).Perhatikan bahwa ini tidak berfungsi untuk direktori, atau tidak dijamin akan berhasil.
Untuk direktori, apa yang Anda inginkan? Jika itu adalah ukuran total semua file di bawahnya, Anda dapat secara rekursif menuntun anak-anak menggunakan
File.list()
danFile.isDirectory()
dan menjumlahkan ukurannya.sumber
The
File
objek memilikilength
metode:sumber
Kode sumber:
sumber
untuk windows, menggunakan java.io fungsi rekursif ini berguna.
Ini diuji dan berfungsi dengan baik di pihak saya.
sumber
Saya telah menguji
du -c <folderpath>
dan 2x lebih cepat dari nio.File atau rekursisumber
sumber
Setelah banyak meneliti dan mencari solusi berbeda yang diusulkan di sini di StackOverflow. Saya akhirnya memutuskan untuk menulis solusi saya sendiri. Tujuan saya adalah memiliki mekanisme no-throw karena saya tidak ingin crash jika API tidak dapat mengambil ukuran folder. Metode ini tidak cocok untuk skenario mult-threaded.
Pertama-tama saya ingin memeriksa direktori yang valid saat menelusuri pohon sistem file.
Kedua, saya tidak ingin panggilan rekursif saya masuk ke symlink (tautan lunak) dan menyertakan ukuran dalam agregat total.
Akhirnya implementasi berbasis rekursi saya untuk mengambil ukuran direktori yang ditentukan. Perhatikan pemeriksaan null untuk dir.listFiles (). Menurut javadoc ada kemungkinan metode ini dapat mengembalikan null.
Beberapa krim kue, API untuk mendapatkan ukuran file daftar (mungkin semua file dan folder di bawah root).
sumber
di linux jika Anda ingin mengurutkan direktori, maka du -hs * | urutkan -h
sumber
Anda dapat menggunakan
Apache Commons IO
untuk mencari ukuran folder dengan mudah.Jika Anda menggunakan maven, silakan tambahkan ketergantungan berikut di
pom.xml
file Anda .Jika bukan penggemar Maven, unduh jar berikut dan tambahkan ke jalur kelas.
https://repo1.maven.org/maven2/commons-io/commons-io/2.6/commons-io-2.6.jar
Untuk mendapatkan ukuran file melalui Commons IO,
Itu juga dapat dicapai melalui
Google Guava
Untuk Maven, tambahkan yang berikut ini:
Jika tidak menggunakan Maven, tambahkan berikut ini ke jalur kelas
https://repo1.maven.org/maven2/com/google/guava/guava/28.1-jre/guava-28.1-jre.jar
Untuk mendapatkan ukuran file,
sumber
sumber