ファイルオブジェクトで.length()を呼び出すと、2GBを超えるファイルは誤った値を返します。
これは、Tomcatコンテナで実行されているWebアプリケーションで発生しています。
たとえば、Windowsが2,083,344,714バイトとして報告するファイルは、Javaから1889761088として返されます。
環境の詳細は次のとおりです。
- jdk 1.6.0_24(64ビット)
- Java JotSpot(TM)64ビットサーバーVM(ビルド17.0-b17、混合モード)
- Tomcat 6.0.29
- Windows Server 2008 r2
そのため、すぐに32ビットVMに関係があるのではないかと思いましたが、すべてが64ビットで実行されているようです。私は完全に困惑しています。問題が32モードで実行されているものに関連しているかどうかを確認するためのテストの開発に役立つだけであれば、どんな助けでも大歓迎です。
編集:
いくつかのコメントに答えるには:同じJVMを使用して非常に単純なテストケースを実行すると(file.lengthを出力するだけ)、正しい値が得られます:2,083,344,714。
私はこれがうまくいくはずだとかなり確信しています、私はちょうど私のtomcat構成/java構成/アプリケーションについて何かが私に苦労しているように感じています。特定のサイズを超えるファイルにのみ影響しているという事実は、実際には32ビットと64ビットの問題のように見えますが、私が知る限り、すべてが64ビットです。
編集2:これはほとんど不可能であると疑うようになり、ファイルが完全にコピーされる前にスレッドがファイルの長さを取得するという問題が発生する可能性があります。誰かが気になったら、私がそれを理解したときにここに投稿します:-)