2011-05-08 25 views
1

我想完成一個黑莓上的大文件上傳。我成功地能夠上傳一個文件,但只有當我讀取文件並一次上傳1個字節時才能上傳文件。對於大文件,我認爲這是性能下降。我希望能夠一次更多地讀取和寫入更多的內容。如果我嘗試將我的緩衝區初始化爲除1以外的任何內容,那麼在寫入所有內容後,我從未從服務器獲得響應。試圖上傳塊

任何想法,爲什麼我一次只能使用1個字節上傳?

z.write(boundaryMessage.toString().getBytes()); 
DataInputStream fileIn = fc.openDataInputStream(); 
boolean isCancel = false; 

byte[]b = new byte[1]; 
int num = 0; 
int left = buffer; 

while((fileIn.read(b)>-1)) 
{ 
    num += b.length; 
    left = buffer - num * 1; 
    Log.info(num + "WRITTEN"); 

    if (isCancel == true) 
    { 
    break; 
    } 

    z.write(b); 
} 
z.write(endBoundary.toString().getBytes()); 
+2

'z'的類是什麼? – MByD 2011-05-08 09:03:16

+0

爲什麼使用DataInputStream?如果您使用openInputStream()並按照某些答案的建議正確地進行字節計數,是否會出現此問題? – 2011-05-08 21:13:54

+0

你使用什麼設備和操作系統?還請添加您使用的其他代碼,以便顯示如何打開/處理/關閉HttpConnection。 – 2011-05-09 07:47:07

回答

0

大多數輸入流不保證在每次讀取時填充緩衝區。 (DataInputStream有一個特殊的方法,readFully(),如果流中沒有足夠的字節來填充緩衝區,將會拋出EOFException)。除非文件是緩衝區長度的倍數,否則不會填充最終讀取緩衝區。所以,你需要存儲讀取的字節數和寫入過程中使用它:

while(!isCancel) 
{ 
    int n = fileIn.read(b); 
    if (n < 0) 
    break; 
    num += n; 
    Log.info(num + "WRITTEN"); 
    z.write(b, 0, n); 
} 
+0

嗨erickson,只是給一個嘗試沒有運氣,客戶端/服務器似乎不在寫入所有字節之後完成連接,就像我一次寫入字節1時一樣。 – 2011-05-08 09:59:49

+0

當我使用你的代碼分析wireshark時,它似乎只有9542字節被轉移時,該文件是119kb。 – 2011-05-08 10:02:40

+0

試過這個循環,但當我打印endbound並嘗試打開inputstream來讀取響應時,掛起,並且9542字節在wireshark的tcp對話中。 – 2011-05-08 10:14:20

0

您的環路不正確。您應該注意讀取的返回值。它返回實際讀取的字節數,並不總是與緩衝區大小相同。

編輯: 這是你平時是怎麼寫循環,做你想做的事:

OutputStream z = null; //Shouldn't be null 
InputStream in = null; //Shouldn't be null 
byte[] buffer = new byte[1024 * 32]; 
int len = 0; 
while ((len = in.read(buffer)) > -1) { 
    z.write(buffer, 0, len); 
} 

請注意,您可能需要使用緩衝流而不是緩衝流。

+0

試過這個循環,但也掛起,當我打印endboundary,並嘗試打開輸入流來讀取響應,並且9542字節在wireshrk的tcp對話中 – 2011-05-08 10:20:37

1

它在黑莓操作系統中出現OS 5.0中的錯誤,並在OS 6.0依然存在。如果您嘗試在OS 5之前使用多字節讀取,它將正常工作。 OS5和更高版本會產生您所描述的行爲。

您還可以通過創建安全連接來解決問題,因爲該錯誤不會爲安全套接字顯示,而只會顯示簡單的套接字。

+0

嗨Micihael,即時通訊已經使用SecureConmnection, – 2011-05-08 18:39:52