繁体   English   中英

如何从GZIPed数据的InputStream中获取解压缩数据的InputStream?

[英]How do I get the InputStream of decompressed data from an InputStream of GZIPed data?

我调用一个返回gzip压缩文件的服务。 我将数据作为一个InputStream(来自javax.activation.DataHandler.getInputStream(); )来自响应。

我想要做的是,在不向磁盘写入任何内容的情况下,在归档文件中的文件中获取解压缩数据的InputStream。 在这种情况下,压缩文件是一个xml文档,我试图使用带有InputStream的javax.xml.bind.Unmarshaller解组。

我正在尝试将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文件所以我'我不知道为什么我会收到“Not in GZIP format”错误。

更新2:我尝试了一些不同的东西 - 相同的错误(“不是GZIP格式”)。 哇,我只是试着用一个分号结束那个括号。 无论如何,这是我的第二次尝试,但仍然不起作用:

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

使用GZIPInputStream装饰输入流。

InputStream decompressed = new GZIPInputStream(compressed);

以下代码应该有效。 请记住,您必须正确处理异常。

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

看看GZIPInputStream。 这是一个例子 ; 这个类非常透明地处理它,几乎没有任何工作可以使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM