内存高效FastByteArrayOutputStream处理超Integer最大值文件异常问题
解决FastByteArrayOutputStream处理超大文件时的块大小溢出问题
问题根源
原addBuffer方法用int类型接收minCapacity参数,当处理的文件总大小超过Integer.MAX_VALUE(2147483647)时,计算下一个2的幂会触发有符号整数溢出,直接得到无效的负数-2147483648,进而引发异常。
可行解决方案
修改参数类型与计算逻辑
把minCapacity的参数类型从int改成long,所有涉及块大小计算的变量也统一用long,彻底避免溢出。下一个2的幂的计算逻辑也要适配long类型:private long nextPowerOfTwo(long minCapacity) { long result = 1; while (result < minCapacity) { // 防止超过Long.MAX_VALUE,可根据实际场景调整上限 if (result > Long.MAX_VALUE / 2) { return Long.MAX_VALUE; } result <<= 1; } return result; }后续缓冲区的分配、管理逻辑也要同步适配
long类型的大小。限制块大小上限
没必要非要用2的幂作为块大小,直接给块大小设个合理上限(比如64MB或128MB),当minCapacity超过这个上限时,直接用固定上限值作为块大小,避免计算过大的2的幂导致溢出:private static final long MAX_BLOCK_SIZE = 1024 * 1024 * 64; // 64MB private long calculateBlockSize(long minCapacity) { if (minCapacity >= MAX_BLOCK_SIZE) { return MAX_BLOCK_SIZE; } // 对小于上限的容量计算下一个2的幂 long result = 1; while (result < minCapacity) { result <<= 1; } return result; }优化写入逻辑,绕开超大缓冲区
既然原本是拆分3个文件写入,不如直接把每个拆分文件的内容分别写入Azure存储的块Blob,最后再合并成完整文件,根本不需要把所有内容加载到本地缓冲区,从根源上解决问题。
内容的提问来源于stack exchange,提问作者user13121564
相关产品推荐
相关产品推荐

