2017-10-28 79 views
0

我試圖實現從.txt文件中提取字符的Huffman算法。 txt文件包含一段文字。現在,當我運行該程序,像這樣FileReader/Scanner讀取文件名,而不是.txt文件的內容

java HuffmanCode large.txt 

它產生的輸出,但它評估的是文件的名稱,「large.txt」,而不是文件large.txt內的文本。我如何讓它讀取內容?謝謝你的幫助。

public static void main(String[] args) throws IOException { 

     String inputFileName = args[0]; 
     FileReader reader = new FileReader(inputFileName); 
     Scanner in = new Scanner(reader); 

     int[] charFreqs = new int[256]; 
     // read each character and record the frequencies 
     for (char c : inputFileName.toCharArray()) 
      charFreqs[c]++; 

     // build tree 
     HuffmanTree tree = buildTree(charFreqs); 

     // print out results 
     System.out.println("SYMBOL\tWEIGHT\tHUFFMAN CODE"); 
     printCodes(tree, new StringBuffer()); 
    } 
} 
+0

Ahem - 'inputFileName.toCharArray()'。你的IDE未使用的警告應該讓你知道。 –

回答

1

你真的很接近 - 你只是遍歷inputFileName.toCharArray(),這是給你的文件名中的字符。你需要讀你in字符變量(這將給你的文件內容)代替,例如:

while (in.hasNextLine()) 
{ 
    char[] line = in.nextLine().toCharArray(); 
    for (char c : line) 
     charFreqs[c]++; 
} 

注意,所以如果你想計算他們這很可能會放棄任何換行符在文件中,你」可能必須手動完成。或者切換到從您已有的FileReader中讀取原始char[],這可能是比上述更好的方法(您需要原始字符數據,而不是「文本」數據,這是Scanner運行的數據)。

+0

非常感謝!那很完美。所以我說得有道理,我可以選擇按行閱讀還是用char閱讀? – Joshua

+0

'InputStream'和朋友讀_bytes_。 「讀者」和朋友閱讀角色。不要混淆兩者。當然不要混淆'byte'和'char' - 雖然看起來你可以簡單地施放;如果從文件中讀取,這是一個非常糟糕的主意。 –

+0

@BoristheSpider好點,我在C模式下思考。我已經更新了答案以反映。 – hnefatl