Java中如何基于writeByte实现可连续调用的writeBit逐位写入方法
核心实现思路
要实现连续调用writeBit不丢失已拼接的比特序列,你需要在当前类定义3个成员变量保存上下文状态:
- 你正在使用的
DataOutputStream实例,作为类成员传入保存 - 暂存未凑够8位的比特的缓冲区
currentByte,初始值为0 - 记录当前缓冲区已攒比特数的计数器
bitCount,初始值为0
成员变量的生命周期和类实例绑定,只要实例不销毁,拼接中的比特数据就会一直保存在内存中,不会因为单次方法调用结束就丢失。
具体实现逻辑
writeBit的执行步骤如下:
- 校验输入的bit只能是
'0'或'1',避免非法值 - 将
currentByte左移1位,给新比特腾出最低位的位置 - 把传入的字符bit转成数字0/1,合并到
currentByte的最低位 - 计数器
bitCount加1 - 如果
bitCount等于8,说明已经凑够1个完整字节,调用DataOutputStream.writeByte写入currentByte,随后重置currentByte为0、bitCount为0
需要额外实现收尾的flush方法:如果最终写入的总比特数不是8的整数倍,剩余不足8位的比特需要补0凑成完整字节写入,所有writeBit调用结束后必须调用flush避免数据丢失。
完整代码示例
import java.io.DataOutputStream; import java.io.IOException; import java.io.FileOutputStream; public class BitWriter { private final DataOutputStream output; private int currentByte = 0; private int bitCount = 0; public BitWriter(DataOutputStream output) { this.output = output; } public void writeBit(char bit) { try { if (bit != '0' && bit != '1') { throw new IllegalArgumentException("比特位只能是'0'或'1'"); } // 拼接新比特到缓冲区 currentByte = (currentByte << 1) | (bit - '0'); bitCount++; // 凑够8位就写入输出流 if (bitCount == 8) { output.writeByte(currentByte); currentByte = 0; bitCount = 0; } } catch (IOException e) { System.out.println(e); } } // 收尾方法,所有比特写完后必须调用 public void flush() throws IOException { // 不足8位的部分补0凑成完整字节 while (bitCount > 0) { currentByte = (currentByte << 1) | 0; bitCount++; if (bitCount == 8) { output.writeByte(currentByte); currentByte = 0; bitCount = 0; } } output.flush(); } // 关闭流自动触发收尾 public void close() throws IOException { flush(); output.close(); } // 使用示例 public static void main(String[] args) throws IOException { DataOutputStream dos = new DataOutputStream(new FileOutputStream("test.bit")); BitWriter bitWriter = new BitWriter(dos); // 连续写入比特 bitWriter.writeBit('1'); bitWriter.writeBit('0'); bitWriter.writeBit('1'); bitWriter.writeBit('1'); bitWriter.writeBit('0'); bitWriter.writeBit('0'); bitWriter.writeBit('1'); bitWriter.writeBit('1'); bitWriter.writeBit('1'); bitWriter.writeBit('0'); // 关闭流写入剩余比特 bitWriter.close(); } }
内容的提问来源于stack exchange,提问作者WeekendJedi
相关产品推荐
相关产品推荐

