我正在研究一个Huffman java应用程序,我差不多完成了。我有一个问题。我需要将一个类似于“101011101010”的字符串保存到文件中。当我用当前代码保存它时,它将其保存为每0或1占用1个字节的字符。我很确定可以将每个0/1保存为一点。
我已经用BitSet和Integer.valueOf尝试了一些东西,但我无法让它们工作。这是我目前的代码:
FileOutputStream fos = new FileOutputStream("encoded.bin");
fos.write(encoded.getBytes());
fos.close();
其中'encoded'是一个字符串,可以是:“0101011101”。如果我尝试将其保存为整数,则将删除前导0。
提前致谢!
编辑:霍夫曼是一种压缩方法,因此输出的文件应尽可能小。
我想我找到了答案。我使用以下代码将1和0放在BitSet中:
BitSet bitSet = new BitSet(encoded.length());
int bitcounter = 0;
for(Character c : encoded.toCharArray()) {
if(c.equals('1')) {
bitSet.set(bitcounter);
}
bitcounter++;
}
之后,我使用bitSet.toByteArray()
将其保存到文件中当我想再次阅读时,我使用BitSet.valueOf(bitSet.toByteArray())
将其转换回bitset。然后我循环遍历bitset,如下所示:
String binaryString = "";
for(int i = 0; i <= set.length(); i++) {
if(set.get(i)) {
binaryString += "1";
} else {
binaryString += "0";
}
}
感谢所有帮助过我的人。
二进制文件仅限于以8的倍数存储位。您可以通过将字符串切成8位块,使用Byte.parseByte(eightCharString, 2)
将它们转换为字节并将它们添加到字节数组来解决此问题:
fos.write()
试试这个。
String encoded = "0101011101";
FileOutputStream fos = new FileOutputStream("encoded.bin");
String s = encoded + "00000000".substring(encoded.length() % 8);
for (int i = 0, len = s.length(); i < len; i += 8)
fos.write((byte)Integer.parseInt(s.substring(i, i + 8), 2));
fos.close();