我有一个应用程序,其中两个进程使用SOAP通信。一个文件正从进程A传输到进程B,进程B会将其存储到DB中。
opqData.setBase64Binary(new DataHandler(new FileDataSource(file)));其中,file是需要存储到DB中的数据。然而,现在我想在将数据存储到DB时将其压缩。一种选择是压缩文件并将其作为FileDataSource发送。然而,我不能使用它,因为我们有超过1000个这样的文件,并且它在文件结构中创建了许多zip条目,创建zip是额外的开销。
因此,我在考虑将DataHandler实现为GzipDataHandler,而返回的输入流是gzipInputStream到进程B。因此,数据将被压缩并存储到DB中。
然而,我对如何为我的新GzipDataHandler编写getInputStream方法感到困惑。
以前有没有人尝试过这样的东西?或者,我能从Java和SOAP专家那里得到任何建议吗?
谢谢,
Dheeraj Joshi
发布于 2012-01-31 11:34:24
这可能会对你有所帮助:
http://www.exampledepot.com/egs/java.util.zip/CompressFile.html
发布于 2012-01-31 21:24:06
好的。我找到了解决方案。解决方案不是更改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
https://stackoverflow.com/questions/9073925
复制相似问题