FastByteArrayOutputStream具有写函数,该写函数具有addBuffer,该addBuffer接受整数形式的minCapacity并且将下一个块大小分配为minCapacity的下一个2的幂。因此,块大小不断增加,以容纳缓冲区中的文件。
我有一个大于最大大小的文件,(内部潜水它到3个文件,将它们推到outputstream,最后在Azure存储中创建一个文件),因此在将其写入缓冲区时,minCapacity超过了2147483647的最大整数值,并开始以有符号整数-2147483648分配块大小,这是无效的,并在所附的图像中给出了异常。
有谁知道解决这个问题的方法吗?构造函数不会有帮助,因为函数只接受整数。
/**
* Create a new buffer and store it in the ArrayDeque.
* <p>Adds a new buffer that can store at least {@code minCapacity} bytes.
*/
private void addBuffer(int minCapacity) {
if (this.buffers.peekLast() != null) {
this.alreadyBufferedSize += this.index;
this.index = 0;
}
if (this.nextBlockSize < minCapacity) {
this.nextBlockSize = nextPowerOf2(minCapacity);
}
this.buffers.add(new byte[this.nextBlockSize]);
this.nextBlockSize *= 2; // block size doubles each time
}
/**
* Get the next power of 2 of a number (ex, the next power of 2 of 119 is 128).
*/
private static int nextPowerOf2(int val) {
val--;
val = (val >> 1) | val;
val = (val >> 2) | val;
val = (val >> 4) | val;
val = (val >> 8) | val;
val = (val >> 16) | val;
val++;
return val;
}
1条答案
按热度按时间plicqrtu1#
FastByteArrayOutputStream
不适用于您的用例。虽然它在内部使用Deque<byte[]>
,但这只是为了减少复制量而进行的优化。如果你看一下源代码,你会发现有很多地方将大小限制为byte[]
的最大大小。..,其为2^31 - 1字节;即2GB - 1。我有一个大于最大大小的文件。..
可能的解决方案:
1.如果要输出文件,请将数据直接写入文件或套接字。没有明显的理由要为此编写使用
ByteArrayOutputStream
变体。它不会提高性能!1.获取
FastByteArrayOutputStream
的源代码并根据自己的目的修改它。但是,您会遇到这样的问题,即getByteArray
和unsafeGetByteArray
方法对于2GB或更大的内容无法实现。和类似的问题。可能有其他的解决办法,但很难说。你不解释你实际上在做什么。