Java azure blob存储:缓冲区不能为空错误?

时间:2016-03-24 16:05:03

标签: java eclipse azure azure-storage-blobs

我正在创建一个Web应用程序,用于从azure blob存储容器中下载文件。

我的大部分工作都有效,但有时会收到以下堆栈跟踪错误: -

java.lang.IllegalArgumentException: The argument must not be null or an empty string. Argument name: buffer.
  at com.microsoft.azure.storage.core.Utility.assertNotNull(Utility.java:272)
  at com.microsoft.azure.storage.blob.CloudBlob.downloadToByteArray(CloudBlob.java:1586)
  at com.microsoft.azure.storage.blob.CloudBlob.downloadToByteArray(CloudBlob.java:1555)
  at DSAengine.Cloudlet.download(Cloudlet.java:176) 

我用来将文件下载到bytearray的代码行是blob.downloadToByteArray(bytearr, 100000);

详细说明' 0'是bytearray的缓冲区,所以我猜这是用来临时存储信息。但是不知道为什么它需要/它做什么,因此不理解如何解决这个错误,因为缓冲区不是null,并且错误只在某些时候发生。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

blob.downloadToByteArray(buffer, 100000);为空时使用buffer时会发生此错误。这或许是这样的:

byte[] buffer = new byte[100000];

for (ListBlobItem blobItem : container.listBlobs()) {
    if (blobItem instanceof CloudBlockBlob) {

        CloudBlockBlob retrievedBlob = (CloudBlockBlob) blobItem;
        retrievedBlob.downloadToByteArray(buffer, 10000);

        // ......

        buffer = null;
    }
}

在完成读取blob之前,您可以检查是否已尝试在代码中的任何位置将缓冲区设置为null。

答案 1 :(得分:0)

我通过以下代码重现了您的问题

byte[] buffer = null;
int bufferOffset = 0;
blob.downloadToByteArray(buffer, 0);

函数public final int downloadToByteArray(final byte[] buffer, final int bufferOffset)的正确用法如下。

/*
 * For example, there is a text file block blob that the content is "ABC123\n"
 * The variable `bufferOffset` must be less than `buffer.length`, 
 * and the buffer size must be more than the sum of the blob size and the `bufferOffset`.
 */
byte[] buffer = new byte[10];
int bufferOffset = 0;
blob.downloadToByteArray(buffer, 0);

作为参考,请参阅源代码CloudBlob.java的第1527行和1555行,并参阅源代码WrappedByteArrayOutputStream.java的第41