Jak mogę sprawdzić rozmiar folderu lub pliku w Javie?
java
filesystems
oneat
źródło
źródło
StatFs
. Korzysta ze statystyk systemu plików i jest prawie 1000x szybszy niż metody rekurencyjne, które były bezużyteczne dla naszych potrzeb. Naszą implementację można znaleźć tutaj: stackoverflow.com/a/58418639/293280Odpowiedzi:
Zwraca długość pliku w bajtach lub
0
jeśli plik nie istnieje. Nie ma wbudowanego sposobu, aby uzyskać rozmiar folderu, będziesz musiał chodzić po drzewie katalogów rekurencyjnie (używająclistFiles()
metody obiektu pliku, który reprezentuje katalog) i zgromadzić rozmiar katalogu dla siebie:OSTRZEŻENIE : Ta metoda nie jest wystarczająco solidna do użytku produkcyjnego.
directory.listFiles()
może powrócićnull
i spowodowaćNullPointerException
. Ponadto nie uwzględnia dowiązań symbolicznych i prawdopodobnie ma inne tryby awarii. Użyj tej metody .źródło
NullPointerException
jeśli katalog jest jednocześnie modyfikowany.Korzystając z interfejsu API java-7 nio, obliczanie rozmiaru folderu może być wykonane znacznie szybciej.
Oto gotowy do uruchomienia przykład, który jest solidny i nie zgłosi wyjątku. Będzie rejestrować katalogi, do których nie może wejść lub miał problemy z przechodzeniem. Dowiązania symboliczne są ignorowane, a jednoczesna modyfikacja katalogu nie sprawi więcej kłopotów niż to konieczne.
źródło
AtomicLong
zamiast tylkolong
?Files
że nie obsługuje go bezpośrednio!Potrzebujesz
FileUtils#sizeOfDirectory(File)
od commons-io .Zauważ, że będziesz musiał ręcznie sprawdzić, czy plik jest katalogiem, ponieważ metoda zgłasza wyjątek, jeśli przekazano do niego plik niebędący katalogiem.
OSTRZEŻENIE : Ta metoda (od commons-io 2.4) ma błąd i może zgłosić,
IllegalArgumentException
jeśli katalog jest jednocześnie modyfikowany.źródło
checkDirectory(directory);
sprawdzeniu. Tylko upewnij się, żeFile.listFiles
ma dzieci. Odniesienia: FileUtils.sizeOfDirectory () , File.listFiles ()IllegalArgumentException
jeśli katalog zostanie zmodyfikowany podczas iteracji.W Javie 8:
Byłoby przyjemniejsze w użyciu
Files::size
w kroku mapy, ale zgłasza zaznaczony wyjątek.UPDATE:
Należy również pamiętać, że może to spowodować wyjątek, jeśli niektóre pliki / foldery nie są dostępne. Zobacz to pytanie i inne rozwiązanie z użyciem guawy .
źródło
źródło
size += getFolderSize(file);
W przypadku Java 8 jest to właściwy sposób:
Odfiltrowanie wszystkich katalogów jest ważne , ponieważ metoda length nie gwarantuje wartości 0 dla katalogów.
Przynajmniej ten kod dostarcza takich samych informacji o rozmiarze, jak sam Eksplorator Windows.
źródło
Oto najlepszy sposób na uzyskanie ogólnego rozmiaru pliku (działa w przypadku katalogu i niekatalogu):
Edycja: Zauważ, że będzie to prawdopodobnie czasochłonna operacja. Nie uruchamiaj go w wątku interfejsu użytkownika.
Również tutaj (pobrane z https://stackoverflow.com/a/5599842/1696171 ) jest dobrym sposobem na uzyskanie czytelnego dla użytkownika ciągu z długo zwróconego:
źródło
Jeśli chcesz używać Java 8 NIO API, następujący program wydrukuje rozmiar katalogu, w którym się znajduje, w bajtach.
calculateSize
Metoda jest uniwersalna dlaPath
obiektów, więc to działa również dla plików. Zauważ, że jeśli plik lub katalog jest niedostępny, w tym przypadku zwracany rozmiar obiektu ścieżki będzie0
.źródło
File.length()
( Javadoc ).Zauważ, że to nie działa w przypadku katalogów lub nie ma gwarancji, że zadziała.
Czego chcesz w przypadku katalogu? Jeśli jest to całkowity rozmiar wszystkich plików znajdujących się pod nim, możesz rekurencyjnie spacerować dzieci używając
File.list()
iFile.isDirectory()
i zsumować ich rozmiary.źródło
File
Obiekt malength
metodę:źródło
Kod źródłowy:
źródło
dla Windows, używając java.io, ta rekurencyjna funkcja jest przydatna.
To jest przetestowane i działa poprawnie po mojej stronie.
źródło
Przetestowałem
du -c <folderpath>
i jest 2x szybszy niż nio.Files lub rekurencjaźródło
źródło
Po wielu badaniach i przyjrzeniu się różnym rozwiązaniom zaproponowanym tutaj w StackOverflow. W końcu zdecydowałem się napisać własne rozwiązanie. Moim celem jest posiadanie mechanizmu no-throw, ponieważ nie chcę się zawiesić, jeśli interfejs API nie może pobrać rozmiaru folderu. Ta metoda nie jest odpowiednia w przypadku scenariusza wielowątkowego.
Przede wszystkim chcę sprawdzić poprawne katalogi podczas przeglądania drzewa systemu plików.
Po drugie, nie chcę, aby moje wywołanie rekurencyjne przechodziło do dowiązań symbolicznych (miękkich) i zawierało łączną wielkość.
Wreszcie moja implementacja oparta na rekurencji, aby pobrać rozmiar określonego katalogu. Zwróć uwagę na zerowe sprawdzenie dla dir.listFiles (). Według javadoc istnieje możliwość, że ta metoda może zwrócić wartość null.
Trochę kremu na torcie, API, aby uzyskać rozmiar listy plików (może to być wszystkie pliki i foldery w katalogu głównym).
źródło
w Linuksie, jeśli chcesz sortować katalogi, to du -hs * | sort -h
źródło
Możesz użyć,
Apache Commons IO
aby łatwo znaleźć rozmiar folderu.Jeśli jesteś na maven, dodaj następującą zależność w swoim
pom.xml
pliku.Jeśli nie jesteś fanem Mavena, pobierz następujący plik jar i dodaj go do ścieżki klasy.
https://repo1.maven.org/maven2/commons-io/commons-io/2.6/commons-io-2.6.jar
Aby uzyskać rozmiar pliku za pośrednictwem Commons IO,
Można to również osiągnąć za pomocą
Google Guava
W przypadku Mavena dodaj następujące informacje:
Jeśli nie używasz Mavena, dodaj następujący kod do ścieżki klasy
https://repo1.maven.org/maven2/com/google/guava/guava/28.1-jre/guava-28.1-jre.jar
Aby uzyskać rozmiar pliku,
źródło
źródło