Como converter tamanho de byte em formato legível por humanos em Java? Assim, 1024 deve se tornar "1 Kb" e 1024 * 1024 deve se tornar "1 Mb".
Estou meio cansado de escrever esse método utilitário para cada projeto. Existem métodos estáticos no Apache Commons para isso?
java
formatting
apache-commons
Igor Mukhin
fonte
fonte
Respostas:
Fonte: Formatação do tamanho do byte para o formato legível por humanos | Programming.Guide
SI (1 k = 1.000)
Binário (1 K = 1.024)
Exemplo de saída:
fonte
du
comando no Linux.)FileUtils.byteCountToDisplaySize(long size)
funcionaria se o seu projeto pudesse dependerorg.apache.commons.io
.JavaDoc para este método
fonte
Usar classe interna do Android
Para o Android, existe uma classe Formatador . Apenas uma linha de código e pronto.
É como
formatFileSize()
, mas tentando gerar números mais curtos (mostrando menos casas decimais).Formata um tamanho de conteúdo para estar na forma de bytes, kilobytes, megabytes etc.
fonte
Context
.Podemos evitar completamente o uso dos métodos lento
Math.pow()
eMath.log()
sem sacrificar a simplicidade, pois o fator entre as unidades (por exemplo, B, KB, MB etc.) é 1024, que é 2 ^ 10. ALong
classe possui umnumberOfLeadingZeros()
método útil que podemos usar para informar em qual unidade o valor do tamanho se enquadra.Ponto-chave: as unidades de tamanho têm uma distância de 10 bits (1024 = 2 ^ 10), o que significa que a posição do 1 bit mais alto - ou seja, o número de zeros à esquerda - difere em 10 (Bytes = KB * 1024, KB = MB * 1024 etc.).
Correlação entre o número de zeros à esquerda e a unidade de tamanho:
O código final:
fonte
Fiz a mesma pergunta recentemente:
Formate o tamanho do arquivo como MB, GB, etc.
Embora não haja uma resposta pronta para uso, eu posso viver com a solução:
Código do teste:
Saída (na minha localidade alemã):
Editar: eu abri um problema solicitando essa funcionalidade para o Google Guava . Talvez alguém se importasse em apoiá-lo.
fonte
Esta é uma versão modificada da resposta do aioobe .
Alterar:
Locale
parâmetro, porque alguns idiomas usam.
e outros,
como ponto decimal.fonte
Se você usa o Android, pode simplesmente usar android.text.format.Formatter.formatFileSize () .
Como alternativa, aqui está uma solução baseada neste post popular :
Ou em Kotlin:
fonte
unitsCount
e nãounitsCount-1
.if(result<unit) break;
vai chutar antes disso. Não se preocupe. (Se você testá-lo, você vai perceber que você pode ignorar a condição de loop for inteiramente.)fonte
fonte
As unidades de bytes permitem que você faça assim:
Eu escrevi outra biblioteca chamada storage-units que permite que você faça assim:
Caso você queira forçar uma determinada unidade, faça o seguinte:
fonte
fonte
Agora existe uma biblioteca disponível que contém a formatação da unidade. Adicionei- o à biblioteca triava , pois a única outra biblioteca existente parece ser uma para o Android.
Ele pode formatar números com precisão arbitrária, em 3 sistemas diferentes (SI, IEC, JEDEC) e várias opções de saída. Aqui estão alguns exemplos de código dos testes de unidade triava :
Imprimindo quilo exato, mega valores (aqui com W = Watt):
Você pode passar um DecimalFormat para personalizar a saída:
Para operações arbitrárias em quilo ou mega valores, é possível dividi-los em componentes:
fonte
Eu sei que é tarde demais para atualizar este post! mas me diverti um pouco com isso:
Crie uma interface:
Crie a classe StorageUnits:
Chame-o:
Resultado:
fonte
Na hipótese de poupar alguém um pouco de tempo, ou talvez apenas por diversão, aqui está uma versão Go. Para simplificar, incluí apenas o caso de saída binária.
fonte
Basta adicionar mais unidades de arquivo (se houver alguma faltando) e você verá o tamanho da unidade nessa unidade (se o seu arquivo tiver esse tamanho) System.out.println ("Tamanho do arquivo no formato apropriado:" + bytes + "" + fileSizeUnits [índice]); sizeToReturn = String.valueOf (bytes) + "" + fileSizeUnits [index]; return sizeToReturn; }
fonte
Aqui está o equivalente em C # .net para a resposta correta de consenso do Java acima. (há outro abaixo com códigos mais curtos)
Tecnicamente falando, se mantivermos as unidades SI, essa rotina funcionará para qualquer uso regular de números. Existem muitas outras boas respostas de especialistas. Suponha que você esteja fazendo a ligação de dados de números em visualizações de grade, vale a pena conferir as rotinas com desempenho otimizado.
PS: Publicado porque esta pergunta / resposta apareceu no topo da pesquisa do Google enquanto estou fazendo o projeto C #.
fonte
Você pode usar StringUtils s’
TraditionalBinarPrefix
:fonte
um pouco antigo, mas ... org.springframework.util.unit.DataSize pode se adequar a esse requisito pelo menos para o cálculo, então um decorador simples fará
fonte
fonte
Você já experimentou o JSR 363 ? Seus módulos de extensão de unidade como Unicode CLDR (no GitHub: uom-systems ) fazem tudo isso para você.
Você pode usar
MetricPrefix
incluído em todas as implementações ouBinaryPrefix
(comparável a alguns dos exemplos acima) e se, por exemplo, mora e trabalha na Índia ou em um país próximoIndianPrefix
(também no módulo comum de uom-systems) permite usar e formatar "Crore Bytes "ou" Lakh Bytes "também.fonte
Talvez você possa usar este código (em C #):
fonte
fonte
Use a função a seguir para obter informações exatas, geradas usando a base de
ATM_CashWithdrawl
conceito.Acabei de modificar o código do facebookarchive-
StringUtils
para obter o formato abaixo. O mesmo formato que você obterá quando usar o apache.hadoop-StringUtils
Exemplo de uso dos métodos acima:
Bytes para obter o formato acima
Para exibir o tempo no formato legível por humanos, use esta função
millisToShortDHMS(long duration)
.fonte
aqui está a conversão de @aioobe convertida para kotlin
fonte