我们可以在Blackberry中将大文件压缩为GZIP的块数据吗?

时间:2011-07-19 09:34:57

标签: blackberry

我在下面看到了示例APIas

public static byte[] compress( byte[] data )
{   
    try
    {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        GZIPOutputStream gzipStream = new GZIPOutputStream( baos, 6, GZIPOutputStream.MAX_LOG2_WINDOW_LENGTH );
        gzipStream.write( data );
        gzipStream.close();
    }
    catch(IOException ioe)
    {
        return null;
    }

    return baos.toByteArray();
} 

但是当我尝试使用Curve 8900 OS 4.6的大文件进行压缩时,我得到了一个“OutOfMemoryError”,所以我想知道如何压缩为一个chunk小数据?

我已经尝试过如下代码,但它不起作用,压缩文件无法解压缩...

file = (FileConnection)Connector.open(_fileOutputPath, Connector.READ_WRITE);
            if (!file.exists()) {
                file.create();
            }
            os = file.openOutputStream();
            is = FileUtil.getInputStream(_fileInputPath, 0);
            int tmpSize = 1024;           
            byte[] tmp = new byte[tmpSize];
            int len = -1;
            gzipStream = new GZIPOutputStream( os, 6, GZIPOutputStream.MAX_LOG2_WINDOW_LENGTH );
            while((len = is.read(tmp, 0, tmpSize)) != -1) {
                gzipStream.write(tmp, 0, len);
            }

2 个答案:

答案 0 :(得分:0)

GZIPOutputStream不会生成适合与gzip命令行工具一起使用的文件。这是因为它不会生成必要的文件头。你是如何测试解压缩的?您应该编写一个类似的Java程序,使用GZIPInputStream进行测试,因为'gunzip'不会识别输入。

答案 1 :(得分:0)

第一个代码示例的问题是ByteArrayOutputStream对于移动设备的有限内存来说太大了。

一个选项可能是首先写入SD卡上的文件(例如)。

第二个代码示例似乎很好,但请参阅Michael的回答。