【问题标题】:Java writing byte into a .txt fileJava 将字节写入 .txt 文件
【发布时间】:2016-09-01 09:26:29
【问题描述】:

我正在我的编程课上练习霍夫曼编码。我已经完成了几乎所有的编码部分。例如,我为每个字符分配了一个代码(即 a=100100),并根据其代码转换文本中的每个字符。然后我将每个代码解析为一个字节列表,就像将 100100 解析为一个字节并将其存储到列表中。但是,我需要将所有字节写入 .txt 文件。我意识到有一个问题。

示例:一个字符的代码为“1001”,它将作为 1 字节而不是 4 位写入 .txt 文件。

我知道在霍夫曼编码之后,字符以如下格式存储: “11100111101011111101011011111000010000101” 但现在我的情况是每个字符占用1个字节的大小,与编码前的原始输入文件大小没有区别。

有没有办法以“11100111101011111101011011111000010000101”之类的格式存储代码?

对不起我的英语,我尽力解释我的困惑。

【问题讨论】:

  • 您必须将每个字节写入二进制字符串。 This话题可以帮到你。
  • 我刚试过你的方法,如果我在文件中写入字符串而不是字节,文件大小会大 10 倍。
  • 这就是txt和二进制格式的区别。

标签: java string encoding byte huffman-code


【解决方案1】:
try (FileWriter fw = new FileWriter("out.txt")) {
    try (BufferedWriter bfw = new BufferedWriter(fw)) {
        char[] buffer = str.toCharArray();
        for (int i = 0; i < buffer.length; i++) {
            bfw.write(Integer.valueOf(Byte.valueOf((byte) buffer[i]).intValue()).toBinaryString());
        }       
    }
}

【讨论】:

    【解决方案2】:

    如果您打算将所有位保留在内存中,您可以使用 BitSet 对象。

    BitSet bits = new BitSet();
    bits.set(7000, true);
    if (bits.get(7000)) { ... }
    byte[] bytes = bits.toByteArray();
    
    Path path = Paths.get("C:/Temp/huffman.bin");
    Files.writeBytes(path, bytes);
    

    立即使用字节是可行的。

    但是你不能写字符;有一个转换把事情搞砸了。 Mind char 是 16 位 UTF-16 格式,包含 Unicode。

    这写入二进制数据,而不是文本。

    对于尾随位,我不知道霍夫曼如何处理,做一些研究;我认为位 0 会做并且不会产生伪影。也许添加较长代码的前 0-7 位。 填充是关键词。

    【讨论】:

      猜你喜欢
      • 2015-12-23
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      相关资源
      最近更新 更多