lzw压缩 java_java实现的LZW 压缩算法源码 | 学步园

导读:/*

* LZW.java

*

* Created on 01 Dec 2005

*

* Implementation of LZW compression/decompression algorithm

*/

import java.io.* ;

/**

*

* @author Moshe Fresko

* @courseAlgorithmic Programming 1

* @exercise3

*/

public class LZW implements Compression

{

boolean stopped = false ;

Dict dict ;

// The bits that should be written for each code

int numOfBits ;

// The previous string that we should remember

// in order to insert into the dictionary

final ByteArray emptyBA = new ByteArray() ;

ByteArray w=emptyBA ;

// Constructor gets the number of bits to be written for each code

public LZW()

{

numOfBits = 12 ;

// Create a new Limited Dictionary

// For maximum of 2^bits entries

dict = new LimitedDict(1// Add all ascii characters to the dictionary

for (int i=0;idict.add(new ByteArray((byte)i)) ;

}

// Encodes the next character.

// If there is a code generated returns it.

// If not returns -1.

int encodeOneChar(int n) {

byte c = (byte) n ;

ByteArray nw = w.conc(c) ;

int code = dict.numFromStr(nw) ;

// if it exists then we continue to search for a longer string

if (code!=-1) {

w = nw ;

return -1 ;

} else {

dict.add(nw) ;

nw = w ;

w = new ByteArray(c) ;

return dict.numFromStr(nw) ;

}

}

// If there is something left in w, returns its code

int encodeLast() {

ByteArray nw = w ;

w = emptyBA ;

return dict.numFromStr(nw) ;

}

// Write the code in bits into output stream

void writeCode(OutputStream os, int code) throws IOException

{

for (int i=0;ios.write(code&1) ;

code /= 2 ;

}

}

int readCode(InputStream is) throws IOException

{

int num = 0 ;

for (int i=0;iint next = is.read() ;

if (nextreturn -1 ;

num += next}

return num ;

}

// We need to call the close() method of BitOutputStream,

// but without closing the encompassing OutputStream

private class UnClosedOutputStream extends FilterOutputStream {

public UnClosedOutputStream(OutputStream os)

{ super(os) ; }

public void write(byte b[], int off, int len) throws IOException

{ out.write(b,off,len) ; }

// Does not close anything

public void close() throws IOException

{ }

}

public void compress(InputStream is, OutputStream os) throws IOException {

os = new BitOutputStream(new UnClosedOutputStream(os)) ;

int next ;// next input character

int code ;// next code generated

while ((next=is.read())>=0) {

if (stopped)

break ;

code = encodeOneChar(next) ;

if (code>=0)

writeCode(os,code) ;

}

code = encodeLast() ;

if (code>=0)

writeCode(os,code) ;

os.close() ;

}

ByteArray decodeOne(int code) {

// Either "ABA" or null, w="AB"

ByteArray str = dict.strFromNum(code) ;

if (str==null) {

str = w.conc(w.getAt(0)) ;

dict.add(str) ;

} else

if (! w.isEmpty())

dict.add(w.conc(str.getAt(0))) ;

w = str ;

return w ;

}

public void decompress(InputStream is, OutputStream os) throws IOException {

is = new BitInputStream(is) ;

ByteArray str ;// Next entry

int code ;// Next code to be read

while ((code=readCode(is))>=0) {

if (stopped)

break ;

str = decodeOne(code) ;

os.write(str.getBytes()) ;

}

}

public void stop()

{ stopped = true ; }

public static void main(String args[]){//简单的测试

LZW lzw=new LZW();

try{

lzw.compress(new FileInputStream("LZW.JAVA"),new FileOutputStream("lzw.lzw"));

lzw.decompress(new FileInputStream("lzw.lzw"),new FileOutputStream("lzw1.java"));

}catch(Exception e){}

}

}

其它文件请下载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单元测试入门

https://docs.microsoft.com/zh-cn/visualstudio/test/getting-started-with-unit-testing?viewvs-2019 使用 Visual Studio 定义和运行单元测试,使代码保持正常运行、确保代码覆盖率并在客户之前找到错误和缺陷。 经常运行单元测试,确保代码正常运行。…

java中乐观锁_Java中乐观锁与悲观锁的实现

锁(locking)业务逻辑的实现过程中,往往需要保证数据访问的排他性。如在金融系统的日终结算处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中(可能是几秒种,也可能是几个小时),数据再发生…

.net开源框架简介和通用技术选型建议

.net体系 .net core .net 类库 asp.net mvc asp.net webapi asp.net core EF 跨平台和运行时解决方案(解决方案) Katana:微软基于OWIN规范实现的非IIS寄宿ASP.NET和MVC等。 MONO.NET:跨平台的.NET运行环境,让.NE…

JAVA 2048源码_java实现2048游戏源代码

本文实例为大家分享了java实现2048游戏源代码,供大家参考,具体内容如下一.主要功能:1、游戏初始化:新建游戏44的16宫格画布,随机格子上生成2或者4两个数字2、格子的移动:先判断能否移动,移动后判…

.Net开源的跨平台爬虫框架 DotnetSpider

项目详细介绍 DotnetSpider是开源的.NET跨平台数据采集爬虫框架。需要 Scheduler,Downloader ,Processor,Pipeline 四部分。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39…

开源干货!.NET Core + Vue.js通用动态权限(RBAC)管理系统框架[DncZeus]开源

DncZeus 前言 关于 DncZeus DncZeus Dnc Zeus "Dnc"--.Net Core 的缩写; "Zeus"--中文译为宙斯,是古希腊神话中的众神之王,奥林匹斯十二主神之首,统治宇宙万物的至高无上的主神(在古希腊神…

浏览器使用java_java如何调用本地的浏览器

1.调用本地的浏览器 import java.io.IOException;import java.net.MalformedURLException;import java.net.URL;public class UseBrowser {public static void main(String[] args) {URL url null;try {url new URL("http://www.baidu.com");} catch (MalformedURL…

java input函数怎么用_Java函数习惯用法详解

在Java编程中,有些知识 并不能仅通过语言规范或者标准API文档就能学到的。在本文中,我会尽量收集一些最常用的习惯用法,特别是很难猜到的用法。我把本文的所有代码都放在公共场所里。你可以根据自己的喜好去复制和修改任意的代码片段&#xf…

十大开源的.NET用户界面框架 让GUI设计不再犯难

选择一款合适的GUI框架是.NET开发中比较重要但又很棘手的问题,因为用户界面相当于一款应用的"门面",直接面向用户。好的UI更能吸引用户,有时甚至成为决定一款应用成败的关键。下面小编整理出十大应用最广泛.NET开源用户界面框架&am…

mysql一对一级联_MySQL 表的一对一、一对多、多对多问题

将实体与实体的关系,反应到最终数据库表的设计上,将关系分为三种:一对一,一对多(多对一)和多对多,所有的关系都是表与表之间的关系;一对一一对一:一张表的一条记录只能与另外一条记录进行对应,反…

.Net开源框架列表

API 框架 NancyFx:轻量、用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台。官网ASP.NET WebAPI:快捷创建 HTTP 服务的框架,可以广泛用于多种不同的客户端,包括浏览器…

java的基础类型和字节大小_java的基础类型和字节大小

学习c语言的时候,这些个东西起码还是很明确的,因为上课的时候,老师经常问,现在时间久了,见的语言多了,也就有点乱了,也没怎么在意过。(武藏) 既然你诚心诚意的发问了,(小次郎) 我…

python flv转mp4_ffmpeg将多个flv文件合成为mp4(python版)

需求直播生成的flv片段需要做个归档,把指定的文件夹中的flv合并成一个mp4,简单的转码合并操作直接用命令行调用来实现。注意事项flv文件直接合并生成mp4的话只有第一个flv的内容才能播放,需要先转换成ts再合成mp4使用的第三方库ffmpy&#xf…

多租户技术

本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。 多租户技术(英语:multi-tenancy technology)或称多重租赁技术,是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件&…

使用开源工具ELK可视化 Azure NSG日志

国内的Azure最近上线了网络观察程序服务,可以帮助用户监控和分析VNET虚拟网络。其中一个很重要的功能就是可以记录NSG的安全访问日志了。但是如果用户设置了NSG流日志,并下载日志想要分析一下的话,会发现日志其实并不是很友好,NSG…

pythoncad二次开发视频_AutoCAD ObjectARX 二次开发(2020版)--4,使用ARX向导创建CAD二次开发项目(编程框架)--...

手动创建ObjectARX应用程序非常麻烦,在此步骤中,将介绍ObjectARX向导。在这里,我们将使用ObjectARX向导创建我们的ObjectARX应用程序。本节的程序的需求是,接收CAD用户的输入。首先,打开VS2017,新建项目在左…

Azure Data Explorer(Kusto)学习笔记

Azure Data Explorer 指南 Azure在2018年推出了Data Explorer产品,提供实时海量流数据的分析服务(非流计算),面向应用、网站、移动端等设备。 用户可以查询,并交互式地对结果进行分析,以达到提升产品、增…

python将一列数据转换成向量_python读取csv和txt数据转换成向量的实例

最近写程序需要从文件中读取数据,并把读取的数据转换成向量。查阅资料之后找到了读取csv文件和txt文件两种方式,下面结合自己的实验过程,做简要记录,供大家参考:1、读取csv文件的数据import csvfiltpath "data_t…

Iaas,Paas,Saas三者的区别联系是什么?

本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。 多租户技术(英语:multi-tenancy technology)或称多重租赁技术,是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件&…

.NET开源的背后:是无奈,还是顺应潮流?

摘要:微软.NET的开源,让许多开发人员欣喜若狂,同时也有许多人好奇其背后的故事,过去视开源为癌症的微软为什么会突然有这一举措,是出于无奈,还是顺应潮流,而这其中的种种或许可以用文中的六个观…