Java Get Tamanho do arquivo
Hoje, ao escrever código, você precisa implementar a função de obter o tamanho do arquivo. Atualmente, existem dois métodos de implementação. Um é usar o método de comprimento do arquivo (); O outro é usar o método FileInputStream's Disponível (). Quando o InputStream não executa a operação de leitura, o tamanho do disponível () deve ser igual ao tamanho do arquivo. Mas ao lidar com arquivos grandes, os problemas ocorrem neste último. Vamos dar uma olhada:
No exemplo, usei o arquivo de imagem de instalação do CentOS 6.5, considerando principalmente que esse arquivo é grande o suficiente (grande que 2 GB).
1. Use o método de comprimento do arquivo ()
public static void main (string [] args) {arquivo f = novo arquivo ("d: //Centos-6.5-x86_64-bin-dvd1.iso"); if (f.Exists () && f.isfile ()) {Logger.info (f.Length ()); } else {logger.info ("o arquivo não existe ou não é um arquivo"); }}Vejamos a saída:
4467982336
O resultado é de 4,16 GB, o que é consistente com os resultados exibidos no Windows.
Em seguida, vamos dar uma olhada no tamanho do arquivo obtido através do FileInputStream:
public static void main (string [] args) {fileInputStream fis = null; tente {arquivo f = novo arquivo ("d: //Centos-6.5-x86_64-bin-dvd1.iso"); fis = new FileInputStream (f); logger.info (fis.Available ()); } catch (Exceção e) {Logger.error (e); } finalmente {if (null! = fis) {tente {fis.close (); } catch (ioexception e) {logger.error (e); }}}}}Aqui estão os resultados em execução:
2147483647
Esse resultado parece familiar? É inteiro.max_value, que é o valor máximo que um número inteiro assinado pode representar.
Então, se você o converter em uma unidade familiar, qual o tamanho do tamanho do arquivo obtido dessa maneira?
É cerca de 2 GB, o que obviamente não é o resultado correto.
O motivo é que o tipo retornado pelo método Length () do arquivo é longo, e o valor máximo do valor positivo que o tipo longo pode representar é: 9223372036854775807. O tamanho máximo do arquivo que pode ser convertido no suporte máximo é: 8954730132868714 EB por. Essa ordem de magnitude será usada por muitos anos na história do desenvolvimento de TI humana. O valor de retorno do método FileInputStream disponível () é int. A faixa de representação máxima foi introduzida antes. O tamanho máximo do arquivo que pode ser suportado é: 1,99 GB, e podemos facilmente chegar a essa ordem de magnitude.
Adicionado em 31 de março de 2014:
Não é viável ler grandes tamanhos de arquivo para métodos de streaming, mas você não pode mais usar o pacote tradicional no java.io.*. Aqui você precisa usar a nova ferramenta no java.nio.* - FileChannel. Vamos dar uma olhada no seguinte código de amostra:
public static void main (string [] args) {filechannel fc = null; tente {arquivo f = novo arquivo ("d: //Centos-6.5-x86_64-bin-dvd1.iso"); if (f.Exists () && f.isfile ()) {FileInputStream fis = new FileInputStream (f); fc = fis.getChannel (); logger.info (fc.size ()); } else {logger.info ("o arquivo não existe ou não é um arquivo"); }} catch (filenotfoundException e) {Logger.error (e); } catch (ioexception e) {logger.error (e); } finalmente {if (null! = fc)) {tente {fc.close (); } catch (ioexception e) {logger.error (e); }}}}}Os resultados obtidos após o uso do Filechannel são consistentes com o primeiro caso, descrevendo com precisão o tamanho exato do arquivo.
Isso também lembra a todos os colegas técnicos que, ao ler arquivos grandes, você deve ter cuidado com os dados do tipo int para evitar bugs ocultos e é difícil localizá-los.
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!