我想通过deflater压缩文件,但似乎不起作用

时间:2016-04-11 13:49:08

标签: java

我必须在文件上传之前做一些预压缩,并且我想使用 deflaterOutputStream 来压缩文件,但 它不会工作 ,如果我有一个大约10MB的文件,当我在输出流上压缩它仍然是10MB,我不知道为什么,我也想知道如何 使用此方法将输出流交换到文件 ,将OutputStream大小与fileSize进行比较,以判断它是否压缩。非常感谢。

public class test {
    public static int m_lvl;
    public static void main(String[] args) {
        try {
            Path file = new File("a.jpg").toPath();
            ByteArrayOutputStream bos = new ByteArrayOutputStream((int) new File("a.png").toPath().toFile().length());
            OutputStream bo = new DeflaterOutputStream( bos, new Deflater( m_lvl, true), 512 );
            Files.copy(file, bos);
            System.out.println((int) new File("a.zip").toPath().toFile().length());
            System.out.println(bos.size());

            bo.close();
            bos.close();
        }  catch (IOException e) {
            e.printStackTrace();
        } 

    }
}

1 个答案:

答案 0 :(得分:3)

从问题看,您似乎正在尝试压缩任何文件。

您应该尝试理解一些概念,与Java本身无关,但需要进行数据压缩和重构。

有两种类型(我的知识有限:)知道用于数据压缩/解压缩的算法:

  1. Lossless algorithms,例如:ZIP
  2. Lossy algorithms,例如JPEG
  3. 如果不详细说明,您要做的就是选择一些原始数据,压缩它(因此占用的空间更少)并将其发送给某人。

    从上面的算法列表中,您可以根据需要选择其中一种算法。例如,如果您要求在压缩数据时没有信息丢失,您可能会选择无损算法(想象一个.docx文件或任何其他文档,例如计算机程序的二进制信息)。

    否则,您可能会选择一种有损算法,例如,如果您向其他人类用户显示图像,并且不介意丢失某些信息,因为人眼无法看到它所有

    现在,问题在于你现在正在尝试做的是压缩已经压缩的文件。

    想象一下:

    1. 你的文字文件中填写了64kb的字母" a"或" a"重复64kb次(使用64kb的磁盘空间)。

    2. 当您想使用无损算法对其进行压缩时,您可能会得到一个带有" 65536a"在一行中使用大约6字节的磁盘空间,意味着在原始文件中重复64kb次。

    3. 想象一下,出于某种原因,您不需要知道重复多少次 - 有损压缩,并且您使用有损算法来执行此操作并获得一个包含读取&的行的单个文件#34;"使用大约1个字节的磁盘空间,意味着它出现在原始文件中。

    4. 现在,如果由于某种原因你需要有损压缩文件的无损压缩文件,使用我的推理,你可能得到类似" 1a"现在占用2个字节的磁盘空间,因此它是一个更大的文件。

    5. 这基本上就是你想要做的事情。压缩已压缩的文件,并且,根据所讨论的算法,您可能会获得较小的文件。最有可能的是,当从有损压缩到无损时,你可能会得到一个更大的文件,如我的例子所示。

      我试图恢复。压缩取决于您是否以较短的方式表达冗余信息。

      编辑2 :重构响应以便进一步澄清。 编辑3 :在我的算法列表中找到了一个类型