Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中如何在dataOutputstream中写入位_Java - Fatal编程技术网

java中如何在dataOutputstream中写入位

java中如何在dataOutputstream中写入位,java,Java,我想写2字节的数据作为一个位。我的位值是0001000000000000,这两个字节的数据我要按位排列 要求: 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 您不能将一个位写入数据输出流。继承自OutputStream和InputStream的所有Java类的I/O粒度为8位字节 这

我想写2字节的数据作为一个位。我的位值是0001000000000000,这两个字节的数据我要按位排列

要求:

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

您不能将一个位写入
数据输出流
。继承自
OutputStream
InputStream
的所有Java类的I/O粒度为8位字节

这有几个原因:

  • 效率-一次写入一位数据的成本过高

  • 操作系统级API(系统调用)不支持这一点;请阅读UNIX/Linux手册页面中的“man 2读取”和“man 2写入”

  • 您要写入的位置(文件、套接字、管道等)都由操作系统建模,数据粒度为8位字节。如果不提供7位,则无法向文件写入1位

  • 8 x N位粒度适用于磁盘控制器、网络接口等的硬件级别。在网络通信标准中。。。下至ISO/OSI 1级


话虽如此,没有什么能阻止您设计和实现自己的JavaAPI,它允许您一次写入(或读取)1位。问题在于,当您开始与操作系统交互时(通过Java I/O类或本机代码),您的API实现必须写入(或读取)8 x N位的包


已经有人做过了吗?很显然,答案是“是的”。谷歌搜索“java比特流类”或“java比特流库”。(很抱歉,没有链接,因为我认为比特流API是一个疯狂的想法,我不想鼓励您浪费时间在这些API上…

使用 通过JBBPBitOutputStream或使用JBBPOut

JBBPOut.BeginBin().Bit(false,false,false,true,true,true).End().toByteArray();

你说的“我想把事情安排得井井有条”是什么意思?你的问题目前还不清楚。请阅读这看起来像RLE压缩,但似乎有任意计数,你没有解释。是否要压缩数据,例如使用与其他数据混合的位字段?举个例子:为什么要将8个0位分成4、1和2组,而不是其他组?我想按位排列方式写入2字节的数据。你在重复你的问题。我们想知道的是:您对
位排列的理解是什么?您希望如何将它们写入文件中?作为交替包含字节数和值的单个字节?使用数据输出流,我正在写入char..short…double…int。。。我想写2个字节的数据,作为bitbyteb=0;字节c=0;b=(字节)(b |)(1)你没有在那里写一点。你在写两个字节…16位。1位!=16位…用英语。。。