2013-01-09 15 views
3

我必須使用MTOM從網絡服務下載文件。下面的實施細節我不知道。我這樣做,這樣一來,它的工作原理(響應對象從符返回和數據是javax.activation.DataHandler類型,filePath是文件,在這裏我想保存下載的內容):如何確定DataHandler.writeTo()方法當前寫入的字節數?

DataHandler dataHandler = response.getData(); 
File file = new File(filePath); 
FileOutputStream fileOutputStream = new FileOutputStream(file); 
dataHandler.writeTo(fileOutputStream); 
fileOutputStream.flush(); 
fileOutputStream.close(); 

但是,我需要的是弄清楚,在下載過程中寫入了多少字節。這可能需要很長時間,這種方式只是等待完成下載,然後關閉輸出流並繼續。

我知道,我可能需要另一個線程來讀取寫入的字節數,並對它做些什麼(需要它來更新SWT應用程序中的progressBar)。

我的想法是擴展DataHandler,然後定期詢問有多少字節被寫入)。但我是java noob,我不知道如何實現它。

回答

0

我做了一些研究,並且忽略了之前稱爲getInputStream()的DataHandler方法。使用這種方法,我可以做我需要:

DataHandler dataHandler = response.getData(); 
File file = new File(filePath); 
FileOutputStream fileOutputStream = new FileOutputStream(file); 

// got Input Stream from DataHandler 
InputStream is = dataHandler.getInputStream(); 

// then I can manage writing file my way   
byte data[] = new byte[BUFFER_SIZE]; 
int br; 
Long bytesWritten = 0L; 
while ((br = is.read(data)) > 0) { 
    fileOutputStream.write(data, 0, br); 
    bytesWritten = bytesWritten + br; 
    // call some method to update UI progressBar 
} 

// this is now useless: 
// dataHandler.writeTo(fileOutputStream); 
fileOutputStream.flush(); 
fileOutputStream.close(); 
0

如果你讀到的一切到byte[],你需要足夠的內存來保存整個文件。這對你來說現在可能不是什麼問題,但不要造成這種壞習慣(這可以輕易放下服務器)。

Apache CommonsGoogle Guava有一個CountingOutputStream類,它完全符合您的要求,只需計算寫入的字節數。如果你不能使用這個庫,你可以編寫一個類似的類,只實現OutputStream,在構造函數中接收另一個OutputStream,每個方法只增加byteCount和委託。

相關問題