Java - 我的霍夫曼减压在极少数情况下不起作用。无法弄清楚为什么

时间:2017-03-01 22:04:59

标签: java arrays byte huffman-code compression

我刚刚编写了一个Huffman压缩/解压缩程序。它的压缩部分似乎工作正常,但我对解压缩有点问题。我对编程很新,这是我第一次进行任何类型的字节操作/文件处理,所以我知道我的解决方案可能很糟糕:D。

在大多数情况下,我的解压缩方法按预期工作,但有时会在解压缩后丢弃数据(也就是说我的解压缩文件小于我的原始文件)。

每当我尝试解压缩不是纯文本文件的文件(例如.jpg)时,解压缩返回一个完全空的文件(0字节),压缩压缩这些其他类型的文件就好了。

减压方法:

    public static void decompress(File file){
        try {
            BitFileReader bfr = new BitFileReader(file);
            int[] charFreqs = new int[256];
            TreeMap<String, Integer> decodeMap = new TreeMap<String, Integer>();
            File nF = new File(file.getName() + "_decomp");
            nF.createNewFile();
            BitFileWriter bfw = new BitFileWriter(nF);
            DataInputStream data = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));

            int uniqueBytes;
            int counter = 0;
            int byteCount = 0;
            uniqueBytes = data.readUnsignedByte();

            // Read frequency table
            while (counter < uniqueBytes){
              int index = data.readUnsignedByte();
              int freq = data.readInt();
              charFreqs[index] = freq;
              counter++;
            }

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

            // build TreeMap
            fillDecodeMap(tree, new StringBuffer(), decodeMap);

            // Skip BitFileReader position to actual compressed code
            bfr.skip(uniqueBytes*5);

            // Get total number of compressed bytes
            for(int i=0; i<charFreqs.length; i++){
                if(charFreqs[i] > 0){
                    byteCount += charFreqs[i];
                }
            }

            // Decompress data and write
            counter = 0;
            StringBuffer code = new StringBuffer();

            while(bfr.hasNextBit() && counter < byteCount){
                code.append(""+bfr.nextBit());

                if(decodeMap.containsKey(code.toString())){
                    bfw.writeByte(decodeMap.get(code.toString()));
                    code.setLength(0);
                    counter++;
                }
            }
            bfw.close();
            bfr.close();
            data.close();

            System.out.println("Decompression successful!");

        } 

        catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        File f = new File("test");
        compress(f);
        f = new File("test_comp");
        decompress(f);
    }
}

当我压缩文件时,我保存“字符”(字节)值和每个唯一“字符”的频率+同一文件中的压缩字节(全部为二进制形式)。然后我使用这个保存的信息在我的decompress()方法中填充charFreqs数组,然后使用该数组来构建我的树。保存结构的格式如下所示:

   <n><value 1><frequency>...<value n><frequency>[the compressed bytes] 

(当然没有&lt;&gt;)其中n是我原始文本中的唯一字节/字符数(AKA我的叶子值)。

我已经测试了我的代码,并且字节似乎在我的解压缩方法底部的while()循环中被删除(charFreqs []并且树似乎保留了所有原始字节值。)

编辑:根据要求,我现在缩短了我的帖子,试图让它不那么杂乱,更“直截了当”。

编辑2:我修好了(但没有完全)!故障发生在我的BitFileWriter而不是我的解压缩方法中。我的减压仍然无法正常工作。每当我尝试解压缩不是纯文本文件(例如.jpg)的东西时,它就会返回一个空的“解压缩”文件(大小为0字节)。我不知道造成这种情况的原因......

0 个答案:

没有答案