9

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());
4

3 に答える 3

5

入力ストリームをGZIPInputStream.

InputStream decompressed = new GZIPInputStream(compressed);
于 2009-11-16T19:32:04.257 に答える
2

次のコードは機能するはずです。例外を適切に処理する必要があることに注意してください。

OutputStream out = null;
InputStream in = null;
try {
   out = /* some output stream */;
   in = new java.util.GZIPInputStream(/*some stream*/);
   byte[] buffer = new byte[4096];
   int c = 0;
   while (( c = in.read(buffer, 0, 4096)) > 0) {
      out.write(buffer, 0, c);
   }
} finally {
   if (in != null) {
      in.close();
   }
   if (out != null) {
      out.close();
   }
}
于 2009-11-16T19:32:21.400 に答える
0

GZIPInputStream を見てください。 以下に例を示します。クラスはこれを非常に透過的に処理します。使用する作業はほとんどありません。

于 2009-11-16T19:27:05.140 に答える