我正在创建一个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,并且错误只在某些时候发生。
非常感谢任何帮助!
答案 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行