Пользовательский DataHandler для SOAP с использованием Java

У меня есть приложение, в котором два процесса общаются с использованием SOAP. Файл передается из процесса A в процесс B. Где процесс B сохранит его в БД.

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

где файл - это данные, которые необходимо сохранить в БД. Однако теперь я хочу заархивировать данные при сохранении их в БД. Один из вариантов — заархивировать файл и отправить его как FileDataSource. Однако я не могу его использовать, потому что у нас более 1000 таких файлов, и он создает много записей zip в файловой структуре, а создание zip требует дополнительных затрат.

Поэтому я подумал реализовать DataHandler как GzipDataHandler, а возвращаемый входной поток — это gzipInputStream для обработки B. Таким образом, данные будут заархивированы и сохранены в БД.

Однако я не понимаю, как написать метод getInputStream для моего нового GzipDataHandler.

Кто-нибудь пробовал что-то подобное раньше? Или я могу получить какие-либо указания от экспертов по Java и SOAP?

Спасибо,
Дирадж Джоши


person Dheeraj Joshi    schedule 31.01.2012    source источник
comment
Какое отношение этот вопрос имеет к SOAP?   -  person Amit    schedule 31.01.2012
comment
Ничего такого. Но люди, которые использовали мыло с Java, могут дать мне некоторое представление.   -  person Dheeraj Joshi    schedule 31.01.2012


Ответы (2)


Это может помочь вам:

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

person Robert Peters    schedule 31.01.2012

Ok. Я узнал решение. Решение заключается не в изменении 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){

}

Выше приведен пример кода.

С уважением,
Дирадж Джоши

person Dheeraj Joshi    schedule 31.01.2012