////////////////Huffman class
import java.util.*;
public class Huffman{
protected PriorityQueue<Entry>pq;
protected Entry[]leafEntries;
public final static int size=256;//standard ASCII
public Huffman(){
Entry entry;
leafEntries=new Entry[size];
for(int i=0;i<size;i++)
{
entry=leafEntries[i]=new Entry();
entry.freq=0;
entry.right=entry.left=entry.parent=null;
}
pq=new PriorityQueue<Entry>();
}
public void updateFrequencies(String
line){
Entry entry;
for(int j=0;j<line.length();j++)
{ leafEntries[(int)(line.charAt(j))].freq++;
}
leafEntries[(int)'\r'].freq++;
}
public void createPQ(){
Entry entry;
for(int i=0;i<size;i++)
{entry=leafEntries[i];
if(entry.freq>0)pq.add(entry);
}
}
public void createHuffmanTree(){
Entry left,right,sum;
while(pq.size()>1)
{
left=pq.remove();//minimum
left.code="0";
right=pq.remove();//min
right.code="1";
sum=new Entry();
sum.parent=null;
sum.freq=left.freq+right.freq;
sum.left=left;
sum.right=right;
left.parent=sum;
right.parent=sum;
pq.add(sum);
}//while
}
public void calculateHuffmanCodes(){
String
code;
Entry entry;
for(int i=0;i<size;i++)
{code="";
entry=leafEntries[i];
if(entry.freq>0)
{
while(entry.parent!=null)
{
code=entry.code+code;
entry=entry.parent;//move
up adding codes
}//while
leafEntries[i].code=code;
}//if
}//for
}//method
public String getCodes(){
Entry entry;
String
codes= new String();
for(int i=0;i<size;i++)
{entry=leafEntries[i];
if(entry.freq>0)codes+=(char)i+" "+entry.code+"\n";
}//for
return codes;
}
public String getEncodedLine(String
line){
Entry entry;
String encodedLine=new String();
for(int i=0;i<line.length();i++)
{entry=leafEntries[(int)(line.charAt(i))];
encodedLine+=entry.code;
}//for
entry=leafEntries[(int)'\r'];
encodedLine+=entry.code;
return encodedLine;
}//method
}//class
////////////////////HuffmanTester.java
import java.io.*;
public class HuffmanTester{
BufferedReader fileReader;
PrintWriter fileWriter;
Huffman huffman;
String inFilePath;
public HuffmanTester(){
huffman=new Huffman();
}
public PrintWriter
openFiles(){
final String IN_FILE_PROMPT=
"\nplease enter a path for the input
file:";
final String
OUT_FILE_PROMPT="\nplease enter a path for the
output file:";
BufferedReader keyboardReader=new
BufferedReader (new InputStreamReader(System.in));
String outFilePath ,line;
boolean pathsOK=false;
while(!pathsOK)
{
try{
System.out.println(IN_FILE_PROMPT);
inFilePath=keyboardReader.readLine();
fileReader=new BufferedReader(new FileReader(inFilePath));
System.out.println(OUT_FILE_PROMPT);
outFilePath=keyboardReader.readLine();
fileWriter=new PrintWriter(new FileWriter(outFilePath));
pathsOK=true;
}
catch(IOException e){System.out.println(e);}
}//while paths
return fileWriter;
}//open files
public void createEncoding(){
String
line;
try{
while(true){
line=fileReader.readLine();
if(line==null)break;
huffman.updateFrequencies(line);
}
fileReader.close();
huffman.createPQ();
huffman.createHuffmanTree();
huffman.calculateHuffmanCodes();
}//try
catch(IOException e){System.out.println(e);}
}//method create
public void saveEncodedMessage(){
String line;
try{
fileWriter.print(huffman.getCodes());
fileWriter.println("*******************");
fileReader=new
BufferedReader(new FileReader(inFilePath));
while(true){
line=fileReader.readLine();
if(line==null)break;
fileWriter.println(huffman.getEncodedLine(line));
}//while
}//try
catch(IOException
e){System.out.println(e);}
}//method
public static void main(String args[]){
PrintWriter writer=null;
try{
HuffmanTester tester=new HuffmanTester();
writer=tester.openFiles();
tester.createEncoding();
tester.saveEncodedMessage();
}
finally
{writer.close();}
}//main
}
Testing Huffman
Running program on command line:
c:\Program
Files\Java\jdk1.6.0_03\bin>java HuffmanTester
please enter a path for the input file:
data2.txt
please enter a path for the output file:
output2.txt
c:\Program
Files\Java\jdk1.6.0_03\bin>
data2.txt
HHHHHHHHHHHHHHHHHHH
AAAAAAAAAAAA
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccc
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
eeeeeeeeeeee
fffffffffffffffffffffffffffffffff
ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
The file output2.txt (coding & encryption for data2.txt)
101100
A 100110
H 101101
a 1000
b 1010
c 10010
d 11
e 100111
f 10111
g 0
*******************
101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101100
100110100110100110100110100110100110100110100110100110100110100110100110101100
100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000101100
101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101100
1001010010100101001010010100101001010010100101001010010100101001010010100101001010010100101001010010101100
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111101100
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111101100
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111101100
100111100111100111100111100111100111100111100111100111100111100111100111101100
101111011110111101111011110111101111011110111101111011110111101111011110111101111011110111101111011110111101111011110111101111011110111101111011110111101111011110111101100
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101100
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101100
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000101100