2013-04-26 55 views
0

我很抱歉,它不会让我标记作业。如何从BitInputStream中读取每个字符的位数随每个字符的变化而变化

你好,我正在学校项目中使用霍夫曼编码来压缩文件中的数据。在这个任务中,您应该使用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."); 
     } 

...其中@参数中是通用的输入流对象和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位)。我想知道如果我不得不改变它试图读取的位数(以及我怎么会这样做),或者如果我以错误的方式来到这里(我最近才习惯了使用位/字节,可能有些重要的东西我不知道)。

对于冗长的问题,我表示歉意,但是让我知道我是否忽略了任何重要的信息。谢谢!

回答

0

您似乎在初始化时调用readBits()额外的时间。这可能是它跳过字母的原因。你应该有这样的:

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

欧普,你是对的。谢谢! – user2116710 2013-04-27 00:00:33

+0

请标记为正确答案。 :-) – user0 2013-04-27 00:02:05