在当今信息爆炸的时代,LZW压缩算法作为一种经典的无损压缩技术,被广泛应用于GIF图像、TIFF文件以及早期的UNIX压缩工具中。本教程将带你从零开始,用Java语言一步步实现LZW压缩与解压缩功能。无论你是编程小白还是有一定经验的开发者,都能轻松掌握!

LZW(Lempel-Ziv-Welch)是一种字典编码的无损数据压缩算法。它通过构建一个动态字典(也叫“字符串表”),将重复出现的字符串用较短的代码代替,从而减少数据体积。
例如,字符串 ABABABA 中,“AB”重复出现多次。LZW会先将“AB”加入字典,并分配一个新代码(如256),后续再遇到“AB”时就直接用256代替,节省空间。
LZW的核心思想是:
下面我们用Java编写一个完整的LZW压缩器。我们将使用 HashMap 来实现字典,使用 ArrayList<Integer> 存储输出的压缩码。
import java.util.*;public class LZWCompressor { public static List<Integer> compress(String input) { // 初始化字典:0-255 对应 ASCII 字符 Map<String, Integer> dictionary = new HashMap<>(); for (int i = 0; i < 256; i++) { dictionary.put(Character.toString((char) i), i); } String current = ""; List<Integer> result = new ArrayList<>(); int dictSize = 256; // 下一个可用的字典索引 for (char c : input.toCharArray()) { String next = current + c; if (dictionary.containsKey(next)) { current = next; } else { // 输出 current 的代码 result.add(dictionary.get(current)); // 将新字符串加入字典 dictionary.put(next, dictSize++); current = String.valueOf(c); } } // 处理最后一个字符串 if (!current.isEmpty()) { result.add(dictionary.get(current)); } return result; } public static void main(String[] args) { String text = "ABABABA"; List<Integer> compressed = compress(text); System.out.println("原始文本: " + text); System.out.println("压缩结果: " + compressed); }}运行上述代码,输出如下:
原始文本: ABABABA压缩结果: [65, 66, 256, 258]
可以看到,原本7个字符被压缩成了4个整数,实现了数据压缩!
解压缩过程是压缩的逆操作。我们从压缩码重建原始字符串,同时动态恢复字典。
public static String decompress(List<Integer> compressed) { // 初始化字典:0-255 对应 ASCII 字符 List<String> dictionary = new ArrayList<>(); for (int i = 0; i < 256; i++) { dictionary.add(Character.toString((char) i)); } int dictSize = 256; StringBuilder result = new StringBuilder(); // 第一个码字一定是单字符 String prev = dictionary.get(compressed.get(0)); result.append(prev); for (int i = 1; i < compressed.size(); i++) { int code = compressed.get(i); String entry; if (code < dictionary.size()) { entry = dictionary.get(code); } else if (code == dictSize) { // 特殊情况:当前码字等于字典大小(KWK 情况) entry = prev + prev.charAt(0); } else { throw new IllegalArgumentException("无效的压缩数据"); } result.append(entry); // 将 prev + entry 的首字符加入字典 dictionary.add(prev + entry.charAt(0)); dictSize++; prev = entry; } return result.toString();}将 decompress 方法添加到之前的类中,并在 main 方法中测试:
List<Integer> compressed = compress("ABABABA");String original = decompress(compressed);System.out.println("解压结果: " + original); // 输出 ABABABA通过本教程,你已经掌握了LZW压缩算法的核心思想,并用Java语言成功实现了压缩与解压缩功能。这项技术是理解更复杂压缩算法(如DEFLATE)的基础。
记住,LZW数据压缩属于无损压缩教程中的经典案例,非常适合学习字典编码思想。动手试试压缩自己的文本吧!
提示:完整代码可在GitHub上找到开源实现,结合本教程效果更佳。
本文由主机测评网于2025-12-04发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025122784.html