2016-03-24 80 views
0

我正在創建一個web應用程序以從azure blob存儲容器下載文件。Java 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的緩衝區,所以我猜這是用來臨時存儲信息的。但不知道爲什麼它需要/它做了什麼,因此不知道如何解決這個錯誤,因爲緩衝區不爲空,並且錯誤只發生在一些時間。

任何幫助,非常感謝!

+0

你能告訴我更多關於如何定義參數'bytearr'以及如何在代碼中使用它的代碼嗎? –

回答

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

你可以檢查你是否已經嘗試設置緩衝區讀完斑點之前在你代碼的任何地方空。

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.java15271555,並參考源代碼WrappedByteArrayOutputStream.java41