Java-如何在文件中写入位而不是字符

时间:2014-12-28 14:55:17

标签: java encoding binaryfiles huffman-code

我正在尝试使用huffman算法在java中编写文本压缩程序。我已经创建了编码代码,我从cmd运行我的程序,如下所示:java main inputFile outputFile其中input是包含4的txt文件专栏:

Hello
My name is
Panagiotis123
Nice to meet you!

我逐行读取了txt,我想创建一个压缩的输出文件,其中包含编码的文本:

  

111000110110100000100011011110001110100110100010100001000111111110011110100101010001011110111111101110101111110011101110011000111001001111001011000111010101101100001001001010011110101011110000111001

输入文件包含45个字符,输出文件包含195个BITS 所以第一个文件大约是45个字节,输出文件是195/8 ...... 我试过这个:

 int b; 
 while ((line2 = br2.readLine()) != null) {
     String a = Encode.encode(line2, hTree);
     for(int k = 0; k < a.length(); k++) {
         b = a.charAt(k);
         fos.write((byte)b);
     }
 }

其中a是包含编码行的String。 fos是这样创建的

FileOutputStream fos = new FileOutputStream(new File(args[1]));

输入文件最终是54个字节,outputFile 198 ... 显然它需要195 0/1作为字符而不是位...

  1. 我该怎么办?
  2. 字符串a可以多长时间?我的意思是如果有一个8字的行,编码的文本可能超过120,如果我分配这么多位会有问题吗?

1 个答案:

答案 0 :(得分:2)

试试这个,添加一些零,直到你有8位的块,然后逐字节解析并写

int b;
while ((line2 = br2.readLine()) != null) {
    String a = Encode.encode(line2, hTree);

    while (a.length() % 8 != 0)
        a += "0"; // lets add some extra bits until we have full bytes
    for (int i = 0; i < a.length(); i += 8) {
        String byteString = a.substring(i, i + 8); // grab a byte
        int parsedByte = 0xFF & Integer.parseInt(byteString, 2);
        fos.write(parsedByte); // write a byte
    }

}