Java-计算文件压缩

Java-计算文件压缩,java,file,compression,zip,rar,Java,File,Compression,Zip,Rar,有没有一种方法可以通过读取文件来获得可能的压缩比? 你知道,有些文件比其他文件更可压缩。。。我的软件必须告诉我文件可能压缩的百分比。 e、 g. 压缩比:50%->如果我压缩文件,可以节省50%的空间 压缩率:99%->如果压缩文件,我只能节省1%的空间如果不检查文件,这是不可能的。您所能做的唯一一件事是,通过实际压缩和测量,根据从相对较大的样本中收集的统计数据,按文件扩展名获得一个近似比率。例如,统计分析可能会显示.zip、.jpg不是高度可压缩的,但.txt和.doc等文件可能高度可压缩 这

有没有一种方法可以通过读取文件来获得可能的压缩比?
你知道,有些文件比其他文件更可压缩。。。我的软件必须告诉我文件可能压缩的百分比。

e、 g.
压缩比:50%
->如果我压缩文件,可以节省50%的空间

压缩率:99%
->如果压缩文件,我只能节省1%的空间

如果不检查文件,这是不可能的。您所能做的唯一一件事是,通过实际压缩和测量,根据从相对较大的样本中收集的统计数据,按文件扩展名获得一个近似比率。例如,统计分析可能会显示.zip、.jpg不是高度可压缩的,但.txt和.doc等文件可能高度可压缩

这样做的结果仅用于粗略的指导,在某些情况下可能会有很大的偏差,因为文件扩展名绝对不能保证可压缩性。该文件可以包含任何内容,无论扩展名是什么


更新:假设您可以检查该文件,那么您可以使用
java.util.zip
API读取原始文件并对其进行压缩,然后查看前后的差异。

不检查该文件是不可能的。您所能做的唯一一件事是,通过实际压缩和测量,根据从相对较大的样本中收集的统计数据,按文件扩展名获得一个近似比率。例如,统计分析可能会显示.zip、.jpg不是高度可压缩的,但.txt和.doc等文件可能高度可压缩

这样做的结果仅用于粗略的指导,在某些情况下可能会有很大的偏差,因为文件扩展名绝对不能保证可压缩性。该文件可以包含任何内容,无论扩展名是什么


更新:假设您可以检查该文件,那么您可以使用
java.util.zip
API读取原始文件并对其进行压缩,然后查看前后的差异。

首先,这在很大程度上取决于您选择的压缩方法。第二,我严重怀疑,如果没有时间和空间复杂度的计算,它是否可能与实际的压缩相比。我认为最好的办法是压缩文件,跟踪已经生成的文件的大小,然后删除/释放(显然,一旦完成),而不是将其写出来


要真正做到这一点,除非您真的想自己实现它,否则使用该类可能是最容易的,尤其是该类及其
deflate
方法

首先,这在很大程度上取决于您选择的压缩方法。第二,我严重怀疑,如果没有时间和空间复杂度的计算,它是否可能与实际的压缩相比。我认为最好的办法是压缩文件,跟踪已经生成的文件的大小,然后删除/释放(显然,一旦完成),而不是将其写出来


要真正做到这一点,除非您真的想自己实现它,否则使用该类可能是最容易的,尤其是该类及其
deflate
方法

首先,你需要学习信息理论。信息论领域有两种理论:

  • 根据香农的说法,人们可以通过使用信源的符号概率来计算信源的熵(即压缩大小)。因此,由统计模型定义的最小压缩大小在每一步产生符号概率。所有算法都隐式或显式地使用这种方法来压缩数据。看看这个,了解更多细节
  • 根据Kolmogorov,最小的压缩大小可以通过寻找产生源代码的最小可能程序来找到。从这个意义上讲,它是无法计算的。一些程序部分使用这种方法压缩数据(例如,您可以编写一个小型控制台应用程序,它可以生成100万位数的PI,而不是压缩100万位数的PI)
  • 因此,如果不计算实际压缩,就无法找到压缩大小。但是,如果你需要一个近似值,你可以依赖香农熵理论,建立一个简单的统计模型。下面是一个非常简单的解决方案:

  • 计算源文件中每个符号的顺序1统计信息
  • 利用这些统计数据计算熵

  • 您的估计将或多或少与ZIP的默认压缩算法(deflate)相同。是同一想法的更高级版本(请注意,它会占用大量内存!)。实际上,它使用熵来确定块边界,从而将文件分割为同质数据。

    首先,您需要学习信息论。信息论领域有两种理论:

  • 根据香农的说法,人们可以通过使用信源的符号概率来计算信源的熵(即压缩大小)。因此,由统计模型定义的最小压缩大小在每一步产生符号概率。所有算法都隐式或显式地使用这种方法来压缩数据。看看这个,了解更多细节
  • 根据Kolmogorov,最小的压缩大小可以通过寻找产生源代码的最小可能程序来找到。从这个意义上讲,它是无法计算的。一些程序部分使用这种方法压缩数据(例如,您可以编写一个小型控制台应用程序,它可以生成100万位数的PI,而不是压缩100万位数的PI)
  • 因此,如果不计算实际压缩,就无法找到压缩大小。但是,如果你需要一个近似值,你可以依赖香农熵理论,建立一个简单的统计模型。下面是一个非常简单的解决方案:

  • 计算源文件中每个符号的顺序1统计信息
  • 利用这些统计数据计算熵
  • 你的估计会