¿Cómo puedo recuperar el tamaño de la carpeta o el archivo en Java?
java
filesystems
oneat
fuente
fuente
StatFs
. Utiliza estadísticas del sistema de archivos y es casi 1000 veces más rápido que los métodos recursivos, que no se podían utilizar para nuestras necesidades. Nuestra implementación se puede encontrar aquí: stackoverflow.com/a/58418639/293280Respuestas:
Esto devuelve la longitud del archivo en bytes o
0
si el archivo no existe. No hay una forma incorporada de obtener el tamaño de una carpeta, tendrá que recorrer el árbol de directorios de forma recursiva (utilizando ellistFiles()
método de un objeto de archivo que representa un directorio) y acumular el tamaño del directorio por sí mismo:ADVERTENCIA : Este método no es lo suficientemente sólido para su uso en producción.
directory.listFiles()
puede volvernull
y causar unNullPointerException
. Además, no considera enlaces simbólicos y posiblemente tenga otros modos de falla. Utilice este método .fuente
NullPointerException
si el directorio se modifica al mismo tiempo.Usando java-7 nio api, calcular el tamaño de la carpeta se puede hacer mucho más rápido.
Aquí hay un ejemplo listo para ejecutar que es robusto y no generará una excepción. Registrará los directorios en los que no puede ingresar o tuvo problemas para recorrer. Los enlaces simbólicos se ignoran y la modificación simultánea del directorio no causará más problemas de los necesarios.
fuente
AtomicLong
lugar de sololong
?Files
que no lo admita directamente!Necesitas
FileUtils#sizeOfDirectory(File)
de commons-io .Tenga en cuenta que deberá verificar manualmente si el archivo es un directorio, ya que el método genera una excepción si se le pasa un no directorio.
ADVERTENCIA : Este método (a partir de commons-io 2.4) tiene un error y puede producirse
IllegalArgumentException
si el directorio se modifica al mismo tiempo.fuente
checkDirectory(directory);
cheque. Solo asegúrate de queFile.listFiles
tenga hijos. Refs: FileUtils.sizeOfDirectory () , File.listFiles ()IllegalArgumentException
si el directorio se modifica mientras está iterando.En Java 8:
Sería mejor usarlo
Files::size
en el paso del mapa, pero arroja una excepción marcada.ACTUALIZACIÓN:
también debe tener en cuenta que esto puede generar una excepción si no se puede acceder a algunos de los archivos / carpetas. Vea esta pregunta y otra solución usando Guava .
fuente
fuente
size += getFolderSize(file);
Para Java 8, esta es una forma correcta de hacerlo:
Es importante filtrar todos los directorios , porque no se garantiza que el método de longitud sea 0 para los directorios.
Al menos este código ofrece la misma información de tamaño que el propio Explorador de Windows.
fuente
Esta es la mejor manera de obtener el tamaño de un archivo general (funciona para directorio y no directorio):
Editar: tenga en cuenta que probablemente esta operación llevará mucho tiempo. No lo ejecutes en el hilo de la interfaz de usuario.
Además, aquí (tomado de https://stackoverflow.com/a/5599842/1696171 ) hay una buena manera de obtener una cadena legible por el usuario de la devolución larga:
fuente
Si desea utilizar Java 8 NIO API, el siguiente programa imprimirá el tamaño, en bytes, del directorio en el que se encuentra.
El
calculateSize
método es universal paraPath
objetos, por lo que también funciona para archivos. Tenga en cuenta que si un archivo o directorio es inaccesible, en este caso, el tamaño devuelto del objeto de ruta será0
.fuente
File.length()
( Javadoc ).Tenga en cuenta que esto no funciona para directorios o no se garantiza que funcione.
Para un directorio, ¿qué quieres? Si es el tamaño total de todos los archivos debajo de él, puede caminar recursivamente a los niños usando
File.list()
yFile.isDirectory()
y sumar sus tamaños.fuente
El
File
objeto tiene unlength
método:fuente
Código fuente:
fuente
para Windows, usando java.io esta función reccursiva es útil.
Esto está probado y funciona correctamente por mi parte.
fuente
He probado
du -c <folderpath>
y es 2 veces más rápido que nio.Files o recursividadfuente
fuente
Después de mucha investigación y análisis de las diferentes soluciones propuestas aquí en StackOverflow. Finalmente decidí escribir mi propia solución. Mi propósito es tener un mecanismo de no tirar porque no quiero fallar si la API no puede recuperar el tamaño de la carpeta. Este método no es adecuado para escenarios de subprocesos múltiples.
En primer lugar, quiero comprobar los directorios válidos mientras recorro el árbol del sistema de archivos.
En segundo lugar, no quiero que mi llamada recursiva entre en enlaces simbólicos (enlaces suaves) e incluya el tamaño en total agregado.
Finalmente, mi implementación basada en recursividad para obtener el tamaño del directorio especificado. Observe la comprobación nula de dir.listFiles (). Según javadoc, existe la posibilidad de que este método pueda devolver un valor nulo.
Un poco de crema en el pastel, la API para obtener el tamaño de los archivos de la lista (pueden ser todos los archivos y carpetas en la raíz).
fuente
en linux si desea ordenar directorios entonces du -hs * | sort -h
fuente
Puede utilizar
Apache Commons IO
para encontrar el tamaño de la carpeta fácilmente.Si está en maven, agregue la siguiente dependencia en su
pom.xml
archivo.Si no eres fanático de Maven, descarga el siguiente jar y agrégalo a la ruta de clases.
https://repo1.maven.org/maven2/commons-io/commons-io/2.6/commons-io-2.6.jar
Para obtener el tamaño del archivo a través de Commons IO,
También se puede lograr a través de
Google Guava
Para Maven, agregue lo siguiente:
Si no usa Maven, agregue lo siguiente a la ruta de clases
https://repo1.maven.org/maven2/com/google/guava/guava/28.1-jre/guava-28.1-jre.jar
Para obtener el tamaño del archivo,
fuente
fuente