gzipで圧縮されたファイルを返すサービスを呼び出します。javax.activation.DataHandler.getInputStream();
応答からのInputStream(提供)としてデータを取得します。
私がやりたいのは、ディスクに何も書き込まずに、アーカイブにあるファイル内の解凍されたデータのInputStreamを取得することです。この場合の圧縮ファイルはjavax.xml.bind.Unmarshaller
、InputStreamを使用してアンマーシャリングしようとしているxmlドキュメントです。
現在、InputStreamをOutputStreamに書き込もうとしています(データを解凍します)。その後、InputStreamに書き戻す必要があります。まだ機能していないので、もっと良い(そう願っています)アプローチがあるかどうかを確認したいと思いました。
最初のInputStreamをディスクに書き込んでgzファイルを取得し、次にそのファイルを読み取り、圧縮ファイルを取り出してそこから移動することができますが、すべてをメモリに保持することは可能です。
更新1:これが私の現在の例です(機能していません-「GZIP形式ではありません」という例外が発生します):
ByteArrayInputStream xmlInput = null;
try {
InputStream in = dh.getInputStream(); //dh is a javax.activation.DataHandler
BufferedInputStream bis = new BufferedInputStream(in);
ByteArrayOutputStream bo = new ByteArrayOutputStream();
int bytes_read = 0;
byte[] dataBuf = new byte[4096];
while ((bytes_read = bis.read(dataBuf)) != -1) {
bo.write(dataBuf, 0, bytes_read);
}
ByteArrayInputStream bin = new ByteArrayInputStream(bo.toByteArray());
GZIPInputStream gzipInput = new GZIPInputStream(bin);
ByteArrayOutputStream out = new ByteArrayOutputStream();
dataBuf = new byte[4096];;
bytes_read = 0;
while ((bytes_read = gzipInput.read(dataBuf)) > 0) {
out.write(dataBuf, 0, bytes_read);
}
xmlInput = new ByteArrayInputStream(out.toByteArray());
ByteArrayOutputStreamに書き込む代わりに、初めてFileOutputStreamに書き込むと、圧縮ファイル(手動で開いてxmlファイルを取得できます)を取得し、サービス(eBay)がgzipファイルであると言っているので' m「GZIP形式ではありません」というエラーが表示される理由がわかりません。
更新2:少し違うことを試しました-同じエラー(「GZIP形式ではありません」)。うわー、私はちょうどその括弧をセミコロンで終わらせようとしました。とにかく、これが私の2回目の試みですが、それでも機能しません。
ByteArrayInputStream xmlInput = null;
try {
GZIPInputStream gzipInput = new GZIPInputStream(dh.getInputStream());
ByteArrayOutputStream bo = new ByteArrayOutputStream();
int bytes_read = 0;
byte[] dataBuf = new byte[4096];
while ((bytes_read = gzipInput.read(dataBuf)) != -1) {
bo.write(dataBuf, 0, bytes_read);
}
xmlInput = new ByteArrayInputStream(bo.toByteArray());