首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android:解压缩连接的gzip压缩文件

Android:解压缩连接的gzip压缩文件
EN

Stack Overflow用户
提问于 2015-02-25 09:01:50
回答 2查看 1.2K关注 0票数 2

gzip记录在案,用于支持压缩文件的连接:

代码语言:javascript
运行
复制
$ echo hello >hhh
$ echo world >www
$ cat hhh www
hello
world
$ echo hello | gzip >hhhh
$ echo world | gzip >wwww
$ cat hhhh wwww | gunzip
hello
world

我可以使用GZIPOutputStream创建一个连接文件,但不幸的是,GZIPInputStream只读取数据的第一部分(从命令行运行的gunzip读取所有数据)。

我在Android4.1.2和4.4.2上都看到了这一点。

如何从Java读取整个文件?

更新:

一个演示错误(主机版本)的示例:

代码语言:javascript
运行
复制
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;


class GZTest {
    static void append(File f, String s) {
        try {
            FileOutputStream fos = new FileOutputStream(f, true);
            //FileOutputStream gzos = fos;
            GZIPOutputStream gzos = new GZIPOutputStream(fos);
            gzos.write(s.getBytes("UTF-8"));
            gzos.close(); // TODO: do it finally{}
            fos.close(); // TODO: do it finally{}
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    static String readAll(File f) {
        try {
            FileInputStream fis = new FileInputStream(f);
            //FileInputStream gzis = fis;
            GZIPInputStream gzis = new GZIPInputStream(fis);
            byte[] buf = new byte[4096];
            int len = gzis.read(buf);
            gzis.close(); // TODO: do it finally{}
            fis.close(); // TODO: do it finally{}
            return new String(Arrays.copyOf(buf, len), "UTF-8");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}

public class A {
    public static void main(String[] args) {
        System.out.println("~~~");
        File f = new File("x.y");
        f.delete();
        GZTest.append(f, "Hello, ");
        GZTest.append(f, "world!\n");
        System.out.println(GZTest.readAll(f));
    }
}

运行它:

代码语言:javascript
运行
复制
$ javac A.java
$ java A
~~~
Hello, 
$ gunzip <x.y
Hello, world!

UPDATE2

看起来这是JDK-2192186的缺陷,据报道在2010-08-03年得到了修复.尽管如此,窃听器现在还在这里。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-16 10:59:59

刚刚尝试了在Android上截断GZIPInputStream的输出的解决方案:它有效。若要使用修复程序克隆分支,请使用:

代码语言:javascript
运行
复制
git clone https://github.com/ymnk/jzlib.git
git checkout concatenated_gzip_streams

然后将目录src/main/java (不能只复制一个文件)复制到项目中,并替换导入:

代码语言:javascript
运行
复制
//import java.util.zip.GZIPInputStream;
import com.jcraft.jzlib.GZIPInputStream;

它在Android!上工作

如果您希望删除不需要的文件,则 you will需要: Adler32.java Deflate.java GZIPInputStream.java Inflate.java InfTree.java Tree.java Checksum.java GZIPException.java InflaterInputStream.java JZlib.java ZStream.java CRC32.java GZIPHeader.java GZIPHeader.java InfCodes.java ZStream.java

不需要:Deflater.java DeflaterOutputStream.java GZIPOutputStream.java ZInputStream.java ZOutputStream.java ZStreamException.java

看起来像删除6个未使用的文件(24K),而留下17个文件(198K)是不值得的结果。

票数 0
EN

Stack Overflow用户

发布于 2015-02-25 14:19:38

对于主机java,正确的读取方式是:

代码语言:javascript
运行
复制
static String readAll(File f) {
    try {
        FileInputStream fis = new FileInputStream(f);
        //FileInputStream gzis = fis;
        GZIPInputStream gzis = new GZIPInputStream(fis);
        final int SIZE=4096;
        byte[] buf = new byte[SIZE];
        int len=0, read=0;
        do {
            read = gzis.read(buf, len, SIZE-len);
            if (read < 0) {
                break;
            }
            len += read;
        } while (len<SIZE);
        gzis.close(); // TODO: do it finally{}
        return new String(Arrays.copyOf(buf, len), "UTF-8");
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

(这个readAll()将用于代替问题中的readAll() )

这段代码不适用于Android!

在Android上,这仍然是

代码语言:javascript
运行
复制
D/~~~     (30098): Hello, 

而命令行gunzip说

代码语言:javascript
运行
复制
# cat /data/data/com.example.gzctest2/files/x.y | gunzip
Hello, world!
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28714911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档