public class HopeHuffMan { public static void main(String[] args) throws IOException { FileInputStream input = new FileInputStream( "f:/testpic.bmp"); String text=Change_input_to_string_Text(input); int[] counts = getCharacterFrequency(text); // Count frequency Tree tree = getHuffmanTree(counts); // Create a Huffman tree String[] codes = getCode(tree.root); // Get codes int k1=text.length(); Compress(text,codes); Decompress (k1,tree); } private static String Change_input_to_string_Text(FileInputStream input1) throws IOException{ int ch; StringBuilder strContent = new StringBuilder(""); while((ch = input1.read()) != -1) strContent.append((char) ch); input1.close(); String text = strContent.toString(); return text; } private static int[] getCharacterFrequency(String text) { int[] counts = new int[256]; // 256 ASCII characters for (int i = 0; i < text.length(); i++) counts[(int)text.charAt(i)]++; // Count the character in text return counts; } private static Tree getHuffmanTree(int[] counts) { // Create a heap to hold trees Heap<Tree> heap = new Heap<Tree>(); // Defined in Listing 24.10 for (int i = 0; i < counts.length; i++) { if (counts[i] > 0) heap.add(new Tree(counts[i], (char)i)); // A leaf node tree } while (heap.getSize() > 1) { Tree t1 = heap.remove(); // Remove the smallest weight tree Tree t2 = heap.remove(); // Remove the next smallest weight heap.add(new Tree(t1, t2)); // Combine two trees } return heap.remove(); // The final tree } private static String[] getCode(Node root) { if (root == null) return null; String[] codes = new String[2 * 128]; assignCode(root, codes); return codes; } private static void assignCode(Node root, String[] codes) { if (root.left != null) { root.left.code = root.code + "0"; assignCode(root.left, codes); root.right.code = root.code + "1"; assignCode(root.right, codes); } else { codes[(int)root.element] = root.code; } } private static int Compress (String text,String[] codes){ String s=""; char cd = 0; for(int i=0;i<text.length();++i){ cd=text.charAt(i); s=s+codes[cd]; } byte [] bytes; bytes=s.getBytes(); for(int i=0;i<bytes.length;++i){ if(bytes[i]==48) bytes[i]=0; if(bytes[i]==49) bytes[i]=1; } BitOutputStream fop2 = new BitOutputStream("f:/is.oli"); for (int i = 0; i < bytes.length; i++) { fop2.writeBit(bytes[i]); } fop2.close(); return bytes.length; } private static void Decompress (int b,Tree t) throws FileNotFoundException, IOException{ BufferedWriter out = new BufferedWriter(new FileWriter("f:/unziped.txt")); BitInputStream fop2 = new BitInputStream("f:/is.oli"); System.out.print("\n"); for (int i = 0;i<b ; i++) { Node x = t.root; while (!x.isLeaf()) { int bit=fop2.readBit(); if (bit==1) x = x.right; if (bit==0) x = x.left; } out.write(x.element); } System.out.print("\n"); out.close(); fop2.close(); } }
var
This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)