是否可以用20位而不是java中的8,16,32位写入文件?

是否可以用20位而不是java中的8,16,32位写入文件?,java,bit,file-writing,file-read,Java,Bit,File Writing,File Read,因此,我目前正在研究lzw算法,以了解压缩,我想知道是否有可能在文件中写入自定义大小的位 所以我使用的是DataOutputStream,我只能用8位、16位和32位来写,但我想知道是否可以用20位来写以节省空间。我所说的节省空间的意思是,当我压缩文件时,我的代码是19位的,因此我不想用writeInt()将它们写成32位,而是想用20位来编写它们,这样压缩的文件就会更小。Java支持的最小数据单位是8位字节。因此,您可以用Java编写的存储20位信息的最小文件大小为24位(3字节) 还有一个事

因此,我目前正在研究lzw算法,以了解压缩,我想知道是否有可能在文件中写入自定义大小的位


所以我使用的是DataOutputStream,我只能用8位、16位和32位来写,但我想知道是否可以用20位来写以节省空间。我所说的节省空间的意思是,当我压缩文件时,我的代码是19位的,因此我不想用writeInt()将它们写成32位,而是想用20位来编写它们,这样压缩的文件就会更小。

Java支持的最小数据单位是8位字节。因此,您可以用Java编写的存储20位信息的最小文件大小为24位(3字节)

还有一个事实是,大多数操作系统支持的底层文件系统不支持任意位大小的文件大小

但是,如果您的意思是,如果可能有一个语义上是20位段序列的数据流,那么一定有可能。您只需对数据进行位移位即可使用写入8、16或32位的方法

例如,20位的2段可以用5个字节写入,其中前2个字节包含第一段的16位,中间字节包含第一段的剩余4位和第二段的前4位,最后2个字节包含第二段的剩余16位:

|--------------------------------------------|
|  1st 20 bit segment  | 2nd 20 bit segment  |
|--------------------------------------------|
| byte1  | byte2  | byte3  | byte4  | byte5  |
|--------------------------------------------|

当然不是100%(只有98%),但纯java是不可能的。您可以从输入流写入/读取的数据的最简单部分是字节,因此无法存储由8位段组成的20位。24是最接近的一个。我认为在本机文件系统中甚至不可能实现,因为扇区(因此数据块)始终是2的强大功能。实现这一点的一种方法是将数据压缩到一个
long[]
,其中每个
long
可以容纳多个数据段。我做了一些类似的事情,在一个不相关的事情。你也许能使它适应你正在尝试做的事情。@antoniosss我怎样才能得到24?我没有看到任何具有24位的基元类型可以做到这一点。将文件或OutputStream作为参数传递给创建方法。@guillaume只使用3字节我不知道什么是位移位,所以我可以使用24位解决方案,但是如果没有24位的基元类型,如何获得24位。您使用3字节。