我刚刚编写了一个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字节)。我不知道造成这种情况的原因......