当每个字符的位数变化时,如何从BitInputStream中读取每个字符

时间:2013-04-26 23:15:22

标签: java inputstream huffman-code

我道歉,它不会让我标记作业。

你好,我正在研究一个使用霍夫曼编码来压缩文件数据的学校项目。在这个赋值中,你应该使用BitInputStream对象读取文件,我不确定它是否在JCL中,因为教授提供的文档存在拼写错误,并且对某些事情不是很明确。无论如何,它似乎与扩展InputStream的其他类一样工作。我从课堂论坛获得的代码行如下:

        try {
            BitInputStream b = new BitInputStream(in);
            int data;

            while((data  = b.readBits(BITS_PER_WORD)) != -1) {
                data = b.readBits(BITS_PER_WORD);
                q.freq[data]++; //instance variable (size 256) in PriorityQueue q to 
                //count number of occurrences of each piece of data.
                System.out.println(data);
            }
        }catch(FileNotFoundException e) {
            System.out.println("File not found.");
        }
        catch(IOException e) {
            System.out.println("Error while reading file.");
        }

...其中@param in是通用输入流对象,BITS_PER_WORD = 8,继承自常量接口。问题是每当我运行它时,它似乎跳过文件中的每个其他字符,从第一个开始。因此,例如,小的.txt文件包含“在湖边看到的怪异的眼睛”。会打印: 101 105 32 121 115 115 101 32 101 114 108 107 46 10('e','i','','y'等。)。我想这与尝试一次读取8位有关,因为'a'的ascii值(例如,以位为单位)是1100001(7位),空间是100000(6位)。我想知道我是否必须以某种方式改变它试图读取的位数(以及我将如何做到这一点)或者如果我以错误的方式来到这里(我最近才习惯了这个想法)使用位/字节,可能有一些我不知道的重要事项。

我为这个冗长的问题道歉,但如果我遗漏了任何重要信息,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:0)

您似乎在初始化时将readBits()称为额外时间。这可能是它跳过字母的原因。你应该有类似的东西:

while(data != -1) {
  data = b.readBits(BITS_PER_WORD);