2014-02-24 51 views
0

我正在開發一個基於HTTP的客戶端服務器應用程序在Java中。我有一個客戶端程序和一個serer程序。基本上,客戶端通過Http發送文件,但在讀取數據時服務器端出現問題。如果我發送大於8KB的文件,我只能在服務器端獲得前8KB的字符。我在stackoverflow上搜索類似的問題,事實證明,該實體被緩衝,所以我必須使用BufferedHttpEntity。這裏是我的代碼:HTTP:如何正確讀取來自BufferedHttpEntity的數據

BufferedHttpEntity buffEntity = new BufferedHttpEntity(entity); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

buffEntity.writeTo(baos); 
while (buffEntity.isStreaming()) { 
    buffEntity.writeTo(baos); 
} 

Log.i("Data received", baos.toString()); 

的問題是,我發送一個16KB的文件,並在控制檯中顯示的最後一個字母是在一半的文檔。我真的不知道如何閱讀緩衝實體的其餘部分。但是,如果我寫的實體的內容到一個文件中(如下圖所示),它工作得很好,所以這是很奇怪:

File f = new File("mnt/sdcard/file.txt"); 
FileOutputStream os = new FileOutputStream(f); 

buffEntity.writeTo(os); 
while (buffEntity.isStreaming()) { 
    buffEntity.writeTo(os); 
} 

此步驟後,如果我看「MNT/SD卡/文件.txt「,文件完整(沒有字符缺失)。我不知道我在做什麼錯誤的ByteArrayOutputStream,因爲它沒有得到所有的內容。任何幫助將非常感激!

回答

1

嘗試使用一個InputStream類似下面的閱讀BufferedHttpEntity:

HttpEntity entity = httpResponse.getEntity(); 

BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity); 

InputStraem is = bufHttpEntity .getContent() ; 

ByteArrayOutputStream bOutput = new ByteArrayOutputStream(is.available()); 


int nRead; 
byte[] data = new byte[is.available()]; 

while ((nRead = is.read(data, 0, data.length)) != -1) { 
    buffer.write(data, 0, nRead); 
} 

buffer.flush(); 

,並請給我一些反饋。

希望有所幫助。

+0

我已經試過這個(我找到了相同的教程),但我有同樣的問題。我只收到第一部分的內容。真奇怪的是它工作正常FileOutputStream – user2435860

+0

inputStream和我發佈的答案是關於閱讀BufferedHttpEntity而不是寫關於如何與FileOutputStream說,以及你如何從BufferedHttpEntity讀取數據的問題 –

+0

我說我已經試過這個,它不起作用。我仍然有同樣的問題。 – user2435860

0

我終於找到了問題。我嘗試在PC上的Java程序上做同樣的事情,並且使用ByteArrayOutputStream它工作得很好,我收到了整個內容。但在Android上,我只能得到一份文件。我認爲這是Android的一些限制,因爲使用ByteArrayOutputStream它將內容保存在內存中,所以如果我收到1GB的內容,它不是很方便,所以它是有道理的。在FileOutputStream的情況下沒有問題,因爲內容沒有保存在內存中,它直接寫入文件。

有沒有人有線索如何將內容從BufferedHttpEntity拆分成塊?