我想写一个2字节的数据。我的位值是00010000 00000000这两个字节数据我想要排在位。
要求:
1 bit - 0
1 bit - 0
1 bit - 0
1 bit - 1
1 bit - 0
1 bit - 0
1 bit - 0
1 bit - 0
4 bit - 0
1 bit - 0
1 bit - 0
2 bit - 0
答案 0 :(得分:1)
您不能将一位写入DataOutputStream
。从OutputStream
和InputStream
继承的所有Java类的I / O粒度是8位字节。
这有几个原因:
效率 - 一次一位地写入数据的成本令人望而却步。
操作系统级别的API(系统调用)不支持此操作;在UNIX / Linux手册页中阅读“man 2 read”和“man 2 write”。
您正在写入的位置(文件,套接字,管道等)都由操作系统建模,其中8位字节作为数据粒度。如果不再提供7位,则不能将1位写入文件。
8 x N位粒度适用于磁盘控制器,网络接口等的硬件级别。在网络通信标准中......直到ISO / OSI 1级。
话虽如此,没有什么可以阻止您设计和实现自己的Java API,允许您一次写入(或读取)1位。问题是,当你开始与操作系统交互时(通过Java I / O类或本机代码),你的API的实现必须是写入(或读取)8 x N位的包。
有没有人这样做过?很明显,答案是肯定的。谷歌为“java比特流类”或“java比特流库”。 (对不起,但没有链接,因为我认为比特流API是一个疯狂的想法,我不想鼓励你浪费你的时间......)
答案 1 :(得分:1)
可以使用JBBP framework将位写入OutputStream 通过JBBPBitOutputStream或JBBPOut
JBBPOut.BeginBin().Bit(false,false,false,true,true,true).End().toByteArray();