Javaファイルサイズを取得します
今日、コードを書くときは、ファイルサイズを取得する機能を実装する必要があります。現在、2つの実装方法があります。 1つは、fileの長さ()メソッドを使用することです。もう1つは、FileInputStreamの利用可能な()メソッドを使用することです。 inputstreamが読み取り操作を実行しない場合、利用可能な()のサイズはファイルサイズに等しくなければなりません。しかし、大きなファイルを扱う場合、後者では問題が発生します。見てみましょう:
この例では、主にこのファイルが十分に大きい(2GBより大きい)ことを考慮して、CENTOS 6.5のインストール画像ファイルを使用しました。
1。ファイルの長さ()メソッドを使用します
public static void main(string [] args){file f = new file( "d://centos-6.5-x86_64-bin-dvd1.iso"); if(f.exists()&& f.isfile()){logger.info(f.length()); } else {logger.info( "ファイルは存在しないか、ファイルではない"); }}出力を見てみましょう:
4467982336
結果は4.16GBで、これはWindowsに表示される結果と一致しています。
次に、FileInputStreamを介して取得したファイルサイズを見てみましょう。
public static void main(string [] args){fileinputStream fis = null; try {file f = new file( "d://centos-6.5-x86_64-bin-dvd1.iso"); fis = new fileinputStream(f); logger.info(fis.abailable()); } catch(例外e){logger.error(e); }最後に{if(null!= fis){try {fis.close(); } catch(ioException e){logger.error(e); }}}}}実行中の結果は次のとおりです。
2147483647
この結果はおなじみのように見えますか?それはinteger.max_valueであり、署名された整数が表すことができる最大値です。
それでは、おなじみのユニットに変換すると、ファイルサイズはこの方法で取得されますか?
約2GBで、明らかに正しい結果ではありません。
その理由は、ファイルの長さ()メソッドによって返されるタイプが長く、長いタイプが表すことができる正値の最大値は9223372036854775807です。この規模は、人間のIT開発の歴史の中で長年にわたって使用されます。 FileInputStreamの利用可能な()メソッドの返品値はintです。最大表現範囲は以前に導入されました。サポートできる最大ファイルサイズは次のとおりです。1.99GBで、この大きさで簡単に到達できます。
2014年3月31日に追加:
ストリーミングメソッド用に大きなファイルサイズを読み取ることは不可能ですが、java.io.*の下で従来のパッケージを使用することはできません。ここでは、java.nio。* -fileChannelの下で新しいツールを使用する必要があります。次のサンプルコードを見てみましょう。
public static void main(string [] args){filechannel fc = null; try {file f = new file( "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( "ファイルは存在しないか、ファイルではない"); }} catch(filenotfoundexception e){logger.error(e); } catch(ioException e){logger.error(e); }最後に{if(null!= fc)){try {fc.close(); } catch(ioException e){logger.error(e); }}}}}FileChannelを使用した後に得られた結果は、最初のケースと一致しており、ファイルの正確なサイズを正確に記述します。
これはまた、すべての技術的な同僚に、大きなファイルを読むときは、非表示のバグを避けるためにINTタイプのデータに注意する必要があり、それらを見つけることは困難であることを思い出させます。
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!