霍夫曼编码将位写入文件以进行压缩

3
我被要求使用哈夫曼编码压缩输入文件并将其写入输出文件。我已完成哈夫曼树结构的实现和哈夫曼编码的生成。但我不知道如何将这些代码写入文件,使得文件比原始文件更小。
目前,我把这些代码表示为字符串(例如,字符'c'的哈夫曼编码为“0100”)。请有人帮助我将这些位写入文件中。
1个回答

3
这里是一个可能的实现方法,将比特流(哈夫曼编码输出)写入文件。
class BitOutputStream {

    private OutputStream out;
    private boolean[] buffer = new boolean[8];
    private int count = 0;

    public BitOutputStream(OutputStream out) {
        this.out = out;
    }

    public void write(boolean x) throws IOException {
        this.count++;
        this.buffer[8-this.count] = x;
        if (this.count == 8){
            int num = 0;
            for (int index = 0; index < 8; index++){
                num = 2*num + (this.buffer[index] ? 1 : 0);
            }

            this.out.write(num - 128);

            this.count = 0;
        }
    }

    public void close() throws IOException {
        int num = 0;
        for (int index = 0; index < 8; index++){
            num = 2*num + (this.buffer[index] ? 1 : 0);
        }

        this.out.write(num - 128);

        this.out.close();
    }

}

通过调用write方法,您可以逐位在文件(OutputStream)中写入内容。
编辑
针对您的具体问题,如果您不想使用其他高级类,可以简单地使用以下代码保存每个字符的哈夫曼编码 -
String huffmanCode = "0100"; // lets say its huffman coding output for c

BitSet huffmanCodeBit = new BitSet(huffmanCode.length());

for (int i = 0; i < huffmanCode.length(); i++) {
    if(huffmanCode.charAt(i) == '1')
        huffmanCodeBit.set(i);
}
String path = Resources.getResource("myfile.out").getPath();
ObjectOutputStream outputStream = null;
try {
    outputStream = new ObjectOutputStream(new FileOutputStream(path));
    outputStream.writeObject(huffmanCodeBit);
} catch (IOException e) {
    e.printStackTrace();
}

谢谢!如果我使用第一种方法,我如何将其解码回字符串?@KaidulIslam - adonayresom
Huffman 编码为不同的字符生成可变长度的编码。因此,无法确定读取下一个字符需要多少位。您需要在两个编码之间放置一些分隔符来表示结束标记。我有一个问题 - 您需要以位格式保存文件还是 ASCII 格式可以? - Kaidul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接