java 内存高效FastByteArrayOutputStream,minCapacity大于Integer i的max size,电话:2147483647

qgelzfjb  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(169)

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;
}
plicqrtu

plicqrtu1#

FastByteArrayOutputStream不适用于您的用例。虽然它在内部使用Deque<byte[]>,但这只是为了减少复制量而进行的优化。如果你看一下源代码,你会发现有很多地方将大小限制为byte[]的最大大小。..,其为2^31 - 1字节;即2GB - 1。
我有一个大于最大大小的文件。..
可能的解决方案:
1.如果要输出文件,请将数据直接写入文件或套接字。没有明显的理由要为此编写使用ByteArrayOutputStream变体。它不会提高性能!
1.获取FastByteArrayOutputStream的源代码并根据自己的目的修改它。但是,您会遇到这样的问题,即getByteArrayunsafeGetByteArray方法对于2GB或更大的内容无法实现。和类似的问题。
可能有其他的解决办法,但很难说。你不解释你实际上在做什么。

相关问题