¿Cómo convertir el tamaño de bytes en formato legible para humanos en Java? Como 1024 debería convertirse en "1 Kb" y 1024 * 1024 debería convertirse en "1 Mb".
Estoy harto de escribir este método de utilidad para cada proyecto. ¿Hay algún método estático en Apache Commons para esto?
java
formatting
apache-commons
Igor Mukhin
fuente
fuente
Respuestas:
Fuente: Formato de tamaño de byte a formato legible para humanos | Programación Guía
SI (1 k = 1,000)
Binario (1 K = 1,024)
Salida de ejemplo:
fuente
du
comando en Linux.)FileUtils.byteCountToDisplaySize(long size)
funcionaría si su proyecto puede dependerorg.apache.commons.io
.JavaDoc para este método
fuente
Utilice la clase integrada de Android
Para Android hay un formateador de clase . Solo una línea de código y ya está.
Es como
formatFileSize()
, pero tratando de generar números más cortos (mostrando menos decimales).Formatea un tamaño de contenido para que tenga la forma de bytes, kilobytes, megabytes, etc.
fuente
Context
.Podemos evitar por completo el uso de métodos lentos
Math.pow()
yMath.log()
sin sacrificar la simplicidad ya que el factor entre las unidades (por ejemplo, B, KB, MB, etc.) es 1024, que es 2 ^ 10. LaLong
clase tiene unnumberOfLeadingZeros()
método útil que podemos usar para decir en qué unidad se encuentra el valor del tamaño.Punto clave: las unidades de tamaño tienen una distancia de 10 bits (1024 = 2 ^ 10), lo que significa que la posición del 1 bit más alto, o en otras palabras, el número de ceros iniciales , difiere en 10 (Bytes = KB * 1024, KB = MB * 1024 etc.).
Correlación entre el número de ceros iniciales y la unidad de tamaño:
El código final:
fuente
Hice la misma pregunta recientemente:
Tamaño del archivo de formato como MB, GB, etc.
Si bien no hay una respuesta lista para usar, puedo vivir con la solución:
Código de prueba:
Salida (en mi localidad alemana):
Editar: he abierto un problema que solicita esta funcionalidad para Google Guava . Quizás a alguien le gustaría apoyarlo.
fuente
Esta es una versión modificada de la respuesta de aioobe .
Cambios:
Locale
parámetro, porque algunos idiomas usan.
y otros,
como punto decimal.fuente
Si usa Android, simplemente puede usar android.text.format.Formatter.formatFileSize () .
Alternativamente, aquí hay una solución basada en esta publicación popular :
O en Kotlin:
fuente
unitsCount
y nounitsCount-1
.if(result<unit) break;
pateará antes de eso. Sin preocupaciones. (Si lo pruebas, se dará cuenta de que puede saltarse la condición de bucle completo.)fuente
fuente
Byte Units te permite hacerlo así:
He escrito otra biblioteca llamada unidades de almacenamiento que le permite hacerlo así:
En caso de que quiera forzar una determinada unidad, haga esto:
fuente
fuente
Ahora hay una biblioteca disponible que contiene formato de unidad. Lo agregué a la triava biblioteca , ya que la única otra biblioteca existente parece ser una para Android.
Puede formatear números con precisión arbitraria, en 3 sistemas diferentes (SI, IEC, JEDEC) y varias opciones de salida. Aquí hay algunos ejemplos de código de las pruebas unitarias triava :
Imprimir kilo exactos, mega valores (aquí con W = Watt):
Puede pasar un DecimalFormat para personalizar la salida:
Para operaciones arbitrarias en kilo o mega valores, puede dividirlos en componentes:
fuente
¡Sé que es demasiado tarde para actualizar esta publicación! pero me divertí un poco con esto:
Crea una interfaz:
Crear clase StorageUnits:
Llámalo:
Salida:
fuente
En el caso improbable, le ahorra a alguien un poco de tiempo, o tal vez solo por un poco de diversión, aquí hay una versión Go. Por simplicidad, solo he incluido el caso de salida binaria.
fuente
Simplemente agregue más unidades de archivo (si falta alguna), y verá el tamaño de la unidad hasta esa unidad (si su archivo tiene tanta longitud) System.out.println ("Tamaño del archivo en el formato adecuado:" + bytes + "" + fileSizeUnits [índice]); sizeToReturn = String.valueOf (bytes) + "" + fileSizeUnits [index]; return sizeToReturn; }
fuente
Aquí está el equivalente de C # .net para la respuesta de consenso correcta de Java anterior. (hay otro debajo que tiene códigos más cortos)
Técnicamente hablando, si nos atenemos a las unidades SI, esta rutina funciona para cualquier uso regular de números. Hay muchas otras buenas respuestas de expertos. Suponga que está vinculando datos de números en vistas de cuadrícula, vale la pena verificar las rutinas optimizadas de rendimiento de ellos.
PD: Publicado porque esta pregunta / respuesta apareció en la parte superior de la búsqueda de Google mientras estoy haciendo el proyecto C #.
fuente
Puede utilizar StringUtils s’
TraditionalBinarPrefix
:fuente
un poco viejo pero, ... org.springframework.util.unit.DataSize podría adaptarse a este requisito al menos para el cálculo, entonces un simple decorador hará
fuente
fuente
¿Has probado JSR 363 ? Sus módulos de extensión de unidad como Unicode CLDR (en GitHub: uom-systems ) hacen todo eso por usted.
Puede usarlo
MetricPrefix
incluido en cada implementación oBinaryPrefix
(comparable a algunos de los ejemplos anteriores) y si, por ejemplo, vive y trabaja en India o en un país cercano,IndianPrefix
(también en el módulo común de uom-systems) le permite usar y formatear "Crore Bytes "o" Lakh Bytes ", también.fuente
Tal vez pueda usar este código (en C #):
fuente
fuente
Use la siguiente función para obtener información exacta, generada tomando la base del
ATM_CashWithdrawl
concepto.Acabo de modificar el código de facebookarchive
StringUtils
para obtener el siguiente formato. El mismo formato que obtendrá cuando use apache.hadoop-StringUtils
Ejemplo de uso de los métodos anteriores:
Bytes para obtener el formato anterior
Para mostrar la hora en formato legible por humanos, use esta función
millisToShortDHMS(long duration)
.fuente
aquí está la conversión de @aioobe convertida a kotlin
fuente