0

我有一个应用程序,其中两个进程使用 SOAP 进行通信。一个文件正在从进程 A 传输到进程 B。进程 B 将其存储到 DB 的位置。

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

其中文件是需要存储到数据库的数据。但是现在我想在将数据存储到数据库时对其进行压缩。一种选择是压缩文件并将其作为 FileDataSource 发送。但是我不能使用它,因为我们有超过 1000 个这样的文件,并且它在文件结构中创建了很多 zip 条目,并且创建 zip 是额外的开销。

所以我想将DataHandler实现为GzipDataHandler,返回的输入流是gzipInputStream来处理B。所以数据将被压缩并存储到数据库中。

但是我很困惑如何为我的新 GzipDataHandler 编写 getInputStream 方法。

有没有人尝试过这样的事情?或者我可以从 Java 和 SOAP 专家那里得到任何指示吗?

谢谢,
Dheeraj Joshi

4

2 回答 2

1

这可能会帮助您:

http://www.exampledepot.com/egs/java.util.zip/CompressFile.html

于 2012-01-31T03:34:23.833 回答
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

于 2012-01-31T13:24:06.480 回答