我有一个应用程序,其中两个进程使用SOAP进行通信。正在将文件从进程A传输到进程B.其中进程B将其存储到DB。
opqData.setBase64Binary(new DataHandler(new FileDataSource(file)));
其中file是需要存储到DB的数据。 但是现在我想在将数据存储到数据库时压缩数据。一种选择是压缩文件并将其作为FileDataSource发送。但是我无法使用它,因为我们有超过1000个这样的文件,它在文件结构中创建了很多zip条目,并且创建zip是增加的开销。
所以我想将DataHandler实现为GzipDataHandler,返回的输入流是gzipInputStream来处理B.因此数据将被压缩并存储到数据库中。
但是我很困惑如何为我的新GzipDataHandler编写getInputStream方法。
有没有人尝试过这样的事情?或者我可以从Java和SOAP专家那里得到任何指示吗?
谢谢,
Dheeraj Joshi
答案 0 :(得分:1)
答案 1 :(得分: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 Joshi