我必须在文件上传之前做一些预压缩,并且我想使用 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();
}
}
}
答案 0 :(得分:3)
从问题看,您似乎正在尝试压缩任何文件。
您应该尝试理解一些概念,与Java本身无关,但需要进行数据压缩和重构。
有两种类型(我的知识有限:)知道用于数据压缩/解压缩的算法:
如果不详细说明,您要做的就是选择一些原始数据,压缩它(因此占用的空间更少)并将其发送给某人。
从上面的算法列表中,您可以根据需要选择其中一种算法。例如,如果您要求在压缩数据时没有信息丢失,您可能会选择无损算法(想象一个.docx文件或任何其他文档,例如计算机程序的二进制信息)。
否则,您可能会选择一种有损算法,例如,如果您向其他人类用户显示图像,并且不介意丢失某些信息,因为人眼无法看到它所有
现在,问题在于你现在正在尝试做的是压缩已经压缩的文件。
想象一下:
你的文字文件中填写了64kb的字母" a"或" a"重复64kb次(使用64kb的磁盘空间)。
当您想使用无损算法对其进行压缩时,您可能会得到一个带有" 65536a"在一行中使用大约6字节的磁盘空间,意味着在原始文件中重复64kb次。
想象一下,出于某种原因,您不需要知道重复多少次 - 有损压缩,并且您使用有损算法来执行此操作并获得一个包含读取&的行的单个文件#34;"使用大约1个字节的磁盘空间,意味着它出现在原始文件中。
现在,如果由于某种原因你需要有损压缩文件的无损压缩文件,使用我的推理,你可能得到类似" 1a"现在占用2个字节的磁盘空间,因此它是一个更大的文件。
这基本上就是你想要做的事情。压缩已压缩的文件,并且,根据所讨论的算法,您可能会获得较小的文件。最有可能的是,当从有损压缩到无损时,你可能会得到一个更大的文件,如我的例子所示。
我试图恢复。压缩取决于您是否以较短的方式表达冗余信息。
编辑2 :重构响应以便进一步澄清。 编辑3 :在我的算法列表中找到了一个类型