我正在尝试读取文件的内容,然后使用霍夫曼编码将它们写入不同的文件。所以我创建了一个哈夫曼树,每个节点包含字符、字符的频率以及表示频率的二进制字符串。我无法理解的是将霍夫曼编码字符写入文件。
我尝试将二进制字符串写入文件,但意识到它只是写入字符串,而不是实际的编码数据。因此,我然后将二进制字符串转换为字节并将字节写入文件,但这只会给我一个与原始大小相同的空白文件。我觉得在实际编写文件时我遗漏了一些东西。
编辑:回顾我的代码后,我意识到我的树并不完全正确,我现在能够(我认为)将位字符串组合在一起以创建一个可以写入文件的字节数组(更新代码以反射(reflect)这一点)。对于我的测试用例,我正在阅读文本 AAA_BB_C
但是当我查看该文件时,输出是 <0x1e>
。我不确定这意味着什么。我期望原始文件的输出相同,只是尺寸较小。
public static void writeFile(HuffTree tree) {
String bin = ""; // String of entire binary code
int spot = 0; // Spot in array
byte[] bytes = new byte[256]; // byte array
try {
FloatileWriter writer = new FileWriter("test(encoded).txt");
// Gets Binary String of each Character in the file
for(int i = 0; i < fileText.length(); i++) {
bin += tree.findDataBinary(fileText.charAt(i));
}
// Takes each bit and adds to byte array
System.out.println(bin);
while(bin.length() > 7) {
String temp = bin.substring(0, 7);
bin = bin.substring(7, bin.length());
bytes[spot] = Byte.parseByte(temp, 2);
spot++;
}
// Writes bytes to file
for(int i = 0; i <= spot; i++) {
writer.write(bytes[i]);
}
writer.close();
} catch(IOException e) {
System.out.println("IOException!");
}
}
最佳答案
这是 Huffman.java 上的代码
https://algs4.cs.princeton.edu/55compression/Huffman.java.html
有点像How to write to a file in Java after Huffman Coding is done
关于java - 如何将霍夫曼编码字符写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56533917/