2012-01-31 43 views
0

我有一個應用程序,其中兩個進程使用SOAP進行對話。正在將文件從進程A傳輸到進程B,進程B將其存儲到數據庫。使用Java的SOAP自定義DataHandler

opqData.setBase64Binary(new DataHandler(new FileDataSource(file))); 

其中文件是需要存儲到數據庫的數據。 但是現在我想在將數據存儲到數據庫時壓縮數據。一種選擇是壓縮文件並將其作爲FileDataSource發送。但是我不能使用它,因爲我們有超過1000個這樣的文件,並且它在文件結構中創建了很多zip條目,並且創建zip是額外的開銷。

所以我想實現DataHandler作爲GzipDataHandler和返回的輸入流是gzipInputStream處理B.因此,數據將被壓縮並存儲到數據庫。

但是我很困惑如何爲我的新GzipDataHandler編寫getInputStream方法。

有沒有人嘗試過這樣的事情?或者我可以從Java和SOAP專家中獲得任何指針?

感謝,
Dheeraj喬希

+0

這是什麼問題與SOAP呢? – Amit 2012-01-31 05:11:00

+0

什麼都沒有。但是使用soap和soap的人可以給我一些想法。 – 2012-01-31 05:12:58

回答

0

確定。我找到了解決方案。 解決方案不是更改DataHandler,而是更改FileDataSource。

創建一個新的FileDataSource說ZipFileDataSource並擴展FileDataSource並實現getInputStream方法。

你的getInputStream方法應該讀取文件,GZIPOutputStream應該壓縮它,它應該通過管道傳遞給調用者。

final PipedOutputStream pos = new PipedOutputStream(); 
final PipedInputStream pis = new PipedInputStream(pos); 
FileInputStream fis = null; 
GZIPOutputStream gos = null; 
byte[] buffer = new byte[1024]; 
try { 
    fis = new FileInputStream(MyFile); 
    gos = new GZIPOutputStream(pos); 
     int length; 
     while ((length = fis.read(buffer, 0, 1024)) != -1) 
    gos.write(buffer, 0, length); 
     fis.close(); 
} catch(Exception e){ 

} 

上面是示例代碼。

問候,
Dheeraj喬希