我正在用 Java 编写自己的图像压缩程序,我将熵编码数据存储在需要写入文件的多个数组中。我知道写入文件的不同方法,但我想知道在尝试使用尽可能少的存储空间时需要考虑什么。例如,我应该使用什么字符集(我只需要写入正数和负数),我是否能够向文件写入不到 1 个字节,我是否应该使用 Scanners/BufferedWriters 等。提前致谢,我可以如果需要,请提供更多信息。
3 回答
你应该
- 不使用 Writers 和字符集,因为您要写入二进制数据
- 使用缓冲流来避免过多的本机调用并加快写入速度
- 不使用扫描仪,因为它们用于读取数据,而不是写入数据
不,您将无法在文件中写入少于一个字节。字节是可以存储在文件中的最小信息量。
我应该使用什么字符集
您需要将数据写入字节,而不是字符,所以忘记字符集。
我可以向文件写入不到 1 个字节吗
不,这是不可能的。但是要遵循解码器预期的位流,您可能需要从 5 位和 3 位之类的东西构造一个字节,然后再将该字节写入文件。
压缩几乎总是比文件 IO 更昂贵。除非您知道这是一个瓶颈,否则您不应该担心写入速度。
我正在用 Java 编写自己的图像压缩程序,我将熵编码数据存储在需要写入文件的多个数组中。我知道写入文件的不同方法,但我想知道在尝试使用尽可能少的存储空间时需要考虑什么。
以二进制格式写入数据,它将是最小的。这就是为什么几乎所有图像格式都使用二进制的原因。
比如我应该使用什么字符集(我只需要写正负数),
字符编码用于编码字符,即文本。您通常不会以二进制格式使用它们(除非它们包含一些您最初不太可能执行的文本)。
我可以向文件写入不到 1 个字节吗?
从技术上讲,您可以使用小于磁盘上的块大小,例如 512 字节或 4 KB。您可以写入比这更少的任何数量,但它不会使用更少的空间,如果这样做也没关系,因为磁盘数量太小而无需担心。
我应该使用 Scanners/BufferedWriters 等吗?
不,这些是用于文本的,
而是使用 DataOutputStream 和 DataInputStream 因为它们是二进制的。