You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何基于writeByte实现可连续调用的writeBit逐位写入方法

核心实现思路

要实现连续调用writeBit不丢失已拼接的比特序列,你需要在当前类定义3个成员变量保存上下文状态:

  • 你正在使用的DataOutputStream实例,作为类成员传入保存
  • 暂存未凑够8位的比特的缓冲区currentByte,初始值为0
  • 记录当前缓冲区已攒比特数的计数器bitCount,初始值为0

成员变量的生命周期和类实例绑定,只要实例不销毁,拼接中的比特数据就会一直保存在内存中,不会因为单次方法调用结束就丢失。


具体实现逻辑

writeBit的执行步骤如下:

  1. 校验输入的bit只能是'0'或'1',避免非法值
  2. 将currentByte左移1位,给新比特腾出最低位的位置
  3. 把传入的字符bit转成数字0/1,合并到currentByte的最低位
  4. 计数器bitCount加1
  5. 如果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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:06:06