2013-04-26 54 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