在文件对象上调用.length()方法时,超过2GB的文件会返回一个错误的值。这是在运行于Tomcat容器中的Web应用程序中发生的。
例如,Windows报告为2,083,344,714字节的文件从Java返回1887961088。以下是环境详细信息:
- jdk 1.6.0_24(64位) - Java JotSpot(TM) 64-Bit Server VM(build 17.0-b17,混合模式) - Tomcat 6.0.29 - Windows Server 2008 r2
所以我立刻怀疑与32位VM有关的问题,但似乎一切都在64位下运行。我完全被卡住了,任何帮助将不胜感激,即使只是帮我开发一些测试来查看问题是否与以某种方式以32位模式运行有关。
编辑:
回答一些评论: 当我使用相同的JVM运行非常简单的测试用例(只输出文件长度)时,我得到了正确的值:2,083,344,714。
我非常自信这应该可以工作,但我感觉我的Tomcat配置/ Java配置/ 应用程序某些方面让我很难受。它仅影响某个大小的文件,这使得它似乎是32位与64位之间的问题,但据我所知,一切都是64位的。
编辑2:开始怀疑这几乎是不可能的,我可能有一个线程在文件完全复制之前取文件长度的问题。如果有人关心的话,我弄清楚后会在这里发布。
例如,Windows报告为2,083,344,714字节的文件从Java返回1887961088。以下是环境详细信息:
- jdk 1.6.0_24(64位) - Java JotSpot(TM) 64-Bit Server VM(build 17.0-b17,混合模式) - Tomcat 6.0.29 - Windows Server 2008 r2
所以我立刻怀疑与32位VM有关的问题,但似乎一切都在64位下运行。我完全被卡住了,任何帮助将不胜感激,即使只是帮我开发一些测试来查看问题是否与以某种方式以32位模式运行有关。
编辑:
回答一些评论: 当我使用相同的JVM运行非常简单的测试用例(只输出文件长度)时,我得到了正确的值:2,083,344,714。
我非常自信这应该可以工作,但我感觉我的Tomcat配置/ Java配置/ 应用程序某些方面让我很难受。它仅影响某个大小的文件,这使得它似乎是32位与64位之间的问题,但据我所知,一切都是64位的。
编辑2:开始怀疑这几乎是不可能的,我可能有一个线程在文件完全复制之前取文件长度的问题。如果有人关心的话,我弄清楚后会在这里发布。