在文件对象上调用 .length() 时,超过 2 GB 的文件返回不正确的值。
这发生在运行在 tomcat 容器中的 Web 应用程序中。
例如,windows 报告为 2,083,344,714 字节的文件从 java 中返回为 1887961088。
以下是环境细节:
- jdk 1.6.0_24(64位)
- Java JotSpot(TM) 64 位服务器 VM(内部版本 17.0-b17,混合模式)
- 雄猫 6.0.29
- 视窗服务器 2008 r2
所以我立即怀疑与 32 位虚拟机有关,但一切似乎都在 64 位运行。我完全被难住了,任何帮助将不胜感激,只要帮助开发一些测试,看看问题是否与以某种方式在 32 模式下运行的东西有关..
编辑:
回答一些评论:当我使用相同的 JVM(仅输出 file.length)运行一个非常简单的测试用例时,我得到了正确的值:2,083,344,714。
我非常有信心这应该可以工作,我只是觉得我的 tomcat 配置/java 配置/应用程序让我很难过。它仅影响超过一定大小的文件这一事实确实使它看起来像是 32 位与 64 位的问题,但据我所知,一切都是 64 位的。
编辑 2:开始怀疑这几乎是不可能的,我可能会遇到一个问题,即线程在文件被完全复制之前占用了文件的长度。如果有人在乎,我会在我弄清楚时在这里发布:-)