You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用FileInputStream从文件内容生成频率表?霍夫曼压缩二进制文件疑问

解决二进制文件的Huffman压缩频率表生成问题

其实核心思路特别直白——既然用FileInputStream处理二进制文件,我们要统计的就不再是字符的出现频率,而是单个字节(byte)的出现次数。毕竟所有类型的文件,不管是文本、图片还是视频,本质都是由字节流构成的。

具体实现步骤:

  • 先初始化一个长度为256的数组:因为byte的取值范围是-128到127,对应256种可能的取值,数组索引可以通过byte & 0xFF转换为0-255的无符号整数,完美避开负数索引的问题。
  • 用FileInputStream循环读取文件字节,更新频率表:
    int currentByte;
    int[] frequencyTable = new int[256];
    try (FileInputStream fis = new FileInputStream("your-file-path")) {
        while ((currentByte = fis.read()) != -1) {
            int unsignedByte = currentByte & 0xFF; // 转成0-255的无符号值
            frequencyTable[unsignedByte]++;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    
  • 读取完成后,这个数组就是构建Huffman树所需的频率表,后续直接用它生成编码表即可。

为什么不用Reader组件?

你之前的选择完全正确——Reader是用来处理字符流的,它会把字节按指定编码转成字符,这对二进制文件来说会直接破坏原始数据(比如图片里的非字符字节会被错误解析)。直接用FileInputStream读取原始字节,才能保证压缩和解压缩后的文件和原文件完全一致。


内容的提问来源于stack exchange,提问作者Fanny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:34:32