0

2 つのプロセスが SOAP を使用して通信するアプリケーションを使用しています。ファイルはプロセス A からプロセス B に転送されています。プロセス B はそれを DB に保存します。

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

ここで、file は DB に保存する必要があるデータです。ただし、DBに保存するときにデータを圧縮したいと考えています。1 つのオプションは、ファイルを圧縮して FileDataSource として送信することです。ただし、そのようなファイルが1000を超えており、ファイル構造に多くのzipエントリが作成され、zipの作成は追加のオーバーヘッドであるため、使用できません。

だから私は DataHandler を GzipDataHandler として実装することを考えていました。返される入力ストリームはプロセス B への gzipInputStream です。そのため、データは圧縮されて DB に保存されます。

ただし、新しい GzipDataHandler の getInputStream メソッドを記述する方法がわかりません。

誰かが前にこのようなことを試したことがありますか? または、Java および SOAP の専門家からアドバイスを得ることができますか?

ありがとう、
ディーラジ・ジョシ

4

2 に答える 2

1

これはあなたを助けるかもしれません:

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

于 2012-01-31T03:34:23.833 に答える
0

Ok。私は解決策を見つけました。解決策は、DataHandler を変更するのではなく、FileDataSource を変更することです。

ZipFileDataSource などの新しい FileDataSource を作成し、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){

}

以上がサンプルコードです。

よろしく、
ディーラジ・ジョシ

于 2012-01-31T13:24:06.480 に答える