- 浏览: 1591422 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (289)
- java 语法基础 (51)
- spring (8)
- mvc struct /Ant --build.xml (8)
- SOA (0)
- oracle 9i/10g (23)
- sql server 2000-2005 (3)
- 数据库基础知识 (6)
- 设计模式与软件架构 (10)
- Hibernate 持久化 (9)
- J2SE/J2EE/J2ME/AJAX 技术 (8)
- JSF 技术 (3)
- JAVA 图形化 (0)
- JMS (40)
- Eclipse 3.2 IDE 开发技巧 (13)
- 项目处理方法集合 (2)
- html/jsp/javascript (2)
- Unix/Linux (9)
- j2me/ARM/windriver/嵌入式 (4)
- 电信科学 (8)
- jsp (1)
- c/c++ (1)
- LZW压缩算法(java) (2)
- Android (77)
- 版本管理git/svn (2)
最新评论
-
huihai:
有demo吗?
NamingStrategy实现动态表名映射 -
cangbaotu:
推荐给大家一些有用的爬虫源码:https://github.c ...
网络爬虫(源代码参考) -
tuspark:
除了.classpath文件以外,.project文件也应该了 ...
Eclipse .classpath文件浅谈 -
tuspark:
造成eclipse自动关闭的原因有很多,这里有很多介绍:ecl ...
eclipse 自动关闭 解决方案 -
DEMONU:
网上都是这些,这种文章。。。
ActiveMQ中的消息持久性
package com.anywhere;
import java.io.*;
/** 一个lzw 压缩算法的 编码 和译码 的实现程序
* 压缩一个已有文件(sourcefile)到目标文件(targetfile) ,然后读取压缩的码;
* 此程序采用12位压缩码,词典作多可以存储2^12个词条;
* 生成的压缩码 经过解压缩,可以恢复为原先文件;
*对文本文件的压缩率,大约为60%,尚不能支持中文的文件输入:)
* @author Lai Yongxuan 2003.3.12
* @version 1.0
*/
public class lzwCode
{
/**
@see Dictionary
*/
Dictionary dic=new Dictionary();
/**count1: the bytes of input file,count2:the bytes of output file
*/
int count1=0,count2=0;
/** the max number of the dictionary;
*this number can be add to the codebuf[] if
* the file has only odd words to be treated ;
*/
/** the input file : character file or coding file
*/
BufferedInputStream in;
/** the output file: character file or coding file
*/
BufferedOutputStream out;
final short END=4095;
/**the entry of the class,and check the arguments first
@param args array of string arguments
-c sourceFile [targetFile] 建立一个压缩文件
-d sourceFile [targetFile] 解压缩一个文件
@return No return value
@exception No ecceptions thrown
*/
public static void main(String []args)
{
if ( args.length<=1 || args.length>4 )
{
System.out.println("-c sourceFile [targetFile] [-dic] 建立一个压
缩文件\n");
System.out.println("-d sourceFile [targetFile] [-dic] 解压缩一个
文件\n");
}
else if(! ( args[0].equals(new String("-c") )||args[0].equals(new
String("-d") ) ) )
{
System.out.println("-c sourceFile [targetFile] 建立一个压缩文件\
n");
System.out.println("-d sourceFile [targetFile] 解压缩一个文件\n"
);
}
else if(args.length>=2)
{
lzwCode a=new lzwCode(args);
a.run(args);
}
return ;
}
/** the constuctor of the class of "lzwCode "
*@param args array of string arguments input at the main()
*
*
*/
public lzwCode(String []args)
{
try{
String f=new String();
in =new BufferedInputStream(
new FileInputStream(
new File(args[1])));
if(args.length==3 && !args[2].equals(new String("-dic")))
{
f=args[2];
}
else
{
int i=args[1].lastIndexOf(new String(".") );
f=args[1].substring(0,i)+((args[0].equals("-c")
)?".lzw":".dlzw");
}
out=new BufferedOutputStream(
new FileOutputStream(
new File(f)));
}//try
catch(FileNotFoundException e )
{
System.err.println(e);
return;
}
catch(IOException e )
{
System.err.println(e);
return;
}
}
/** the entry of the process;
@param Srring args[]: array of string arguments input at the main()
BufferedInputStream in: the input charstream file
BufferedOutputStream out:the output code stream file
* @return No return value
*/
public void run(String args[] )
{
if(args[0].equals(new String("-c")) )
{
code(in,out);
}
else
{
decode(in,out);
}
if(args[args.length-1].equals(new String("-dic") ))
System.out.println(dic.toString ());
}
/** input the charstream from a file,and output the code stream to anpther
file
* @param BufferedInputStream in: the input charstream file
BufferedOutputStream out:the output code stream file
* @return No return value
*
*/
public void code(BufferedInputStream in,BufferedOutputStream out)
{
System.out.println("coding...\n"+ ".......\n");
//a:the buffer byte read from the input file,then to be converted to
String
//buf: the codestream to store in the code file
//prefix :the pre_String of the dictory
// the indexbuf[] is the index of dictionary to be converted in
// the code file
//str: the current charecter of the character input Stream
byte a[]=new byte[1],buf[]=new byte[3];
String prefix="",cur="";
byte i=0;
short indexbuf[]=new short[2];
String str=null;
try{
short m=0;
while( (a[0]=(byte)in.read() ) != -1 )
{
cur=new String(a);// be converted
count1++; // the number of bytes of input file
str=prefix;
str=str.concat(cur);
m=(short)dic.indexOf(str);
if( m!=-1)//the prefix is in the dictionary,
{
prefix=str;
}
else//
{
if(i==0)//the first indexbuf,store in codebuf[]
{
indexbuf[0]=(short)dic.indexOf(prefix);
i=1;
}
else// now have 2 index number,then ouput to the code file
{
indexbuf[1]=(short)dic.indexOf(prefix);
zipOutput(out,indexbuf);
count2+=3;//3 bytes stored to the code file
i=0;
}
dic.add(str);
prefix=cur;
}//else
}//while
// System.out.println("i="+i);
if(i==(byte)1) //this is the case that the
//input file has only odd index number to store
{
indexbuf[1]=END;//put a special index number
//(the max number of the dictionary) END to the
code file
zipOutput(out,indexbuf);
count2+=3;
}
dic.add(str);
in.close ();
out.close ();
System.out.println("zip rate:"+(float)count2*100/count1+"% ");
}catch(IOException e )
{
System.err.println(e);
return;
}
catch(OutDictionaryException e)
{
System.err.println(e);
return;
}
}
/** input the code stream from a file,and output the char stream to anpther
file
* @param BufferedInputStream in: the input code file
BufferedOutputStream out:the output charstream stream file
* @return No return value
* @exception No return Exception
*
*
*/ public void decode(BufferedInputStream in,BufferedOutputStream out)
{
System.out.println("decoding...\n"+".......\n");
short precode=0,curcode=0;
String prefix=null;
short i=0;
short bufcode[]=new short[2];//2 code read from the code file
boolean more=true;//indicate the end of the file or some error while
input the file
// DataOutputStream out2=new DataOutputStream(out);
try{
more=zipInput(in,bufcode);//first input 2 code
if(more)
{
curcode=bufcode[0];
// out2.writeChars(dic.getString(curcode));
stringOut(out,dic.getString(curcode) );
}
else
System.out.println("error in the beginning...");
while(more)
{
precode=curcode;
if(i==0)
{
curcode=bufcode[1];
i=1;
}
else
{
more=zipInput(in,bufcode);
curcode=bufcode[0];
if(bufcode[1]==END)
{
stringOut(out,dic.getString (bufcode[0] ));
break;
}
i=0;
}
if(curcode<dic.length())//if the prefix string can be found in the
dictory
{
// out2.writeChars(dic.getString(curcode));
stringOut(out,dic.getString(curcode) );
prefix=dic.getString(precode);
prefix+=(dic.getString(curcode)).substring(0,1);
dic.add(prefix);
}
else
{
prefix=dic.getString(precode);
prefix+=prefix.substring(0,1);
// out2.writeChars(prefix);
stringOut(out,prefix );
dic.add(prefix);
}//else
}//while
in.close ();
out.close ();
}catch( OutDictionaryException e )
{
System.err.println(e);
return;
}
catch(IOException e)
{
System.err.println(e);
return;
}
}
/** output the index number of the dictionary to the code stream;
ecah index is converted to 12 bit ;and output 2 short numbers at a
time
* @param BufferedOutputStream out:the output charstream stream file
short index[]:the 2 short array to be converted to code form
* @return No return value
* @exception No return Exception
*
*
*/
private void zipOutput(BufferedOutputStream out,short index[])
{
try{
byte buf[]=new byte[3];
buf[1]=(byte)(index[0]<<4);
buf[0]=(byte)(index[0]>>4);
buf[2]=(byte)index[1];
buf[1]+=(byte)(index[1]>>8);
out.write(buf,0,3);
//out put the decoding
// System.out.println(index[0]+"\t"+index[1]+"\t");
/* short codebuf[]=new short[2];
//codebuf[0]=(short)(buf[0]<<4);
codebuf[0]=toRight(buf[0],4);
codebuf[0]+=(short)(toRight(buf[1],0)>>4);
//codebuf[1]=(short)buf[2];
codebuf[1]=toRight(buf[2],0);
//codebuf[1]=(byte)(buf[1]<<4);
byte temp=(byte)(toRight(buf[1],4));
codebuf[1]+=toRight(temp,4);
// codebuf[1]+=(short)(buf[1]<<4);
System.out.println("\t"+codebuf[0]+"\t"+codebuf[1]);
*/
}catch( IOException e )
{
System.err.println(e);
return;
}
}
/** convert the code stream to the file in the original way;
* each time deel with 3 bytes,and return 2 index number
* @param BufferedOutputStream in :the input code stream file
short index[]:the 2 short array buffer of index of dictionary
* @return return loolean value:if not the end of file and the converted
code
is right ,return true;else ,return false
* @exception No return Exception
*
*
*/
private boolean zipInput(BufferedInputStream in,short codebuf[])
{
byte buf[]=new byte[3],temp;
//int intbuf[]=new int[3],temp;
short le=(short)dic.length();
try{
if(in.read(buf,0,3)!=3)
{
System.out.println("the end of the file!");
return false;
}
//codebuf[0]=(short)(buf[0]<<4);
codebuf[0]=toRight(buf[0],4);
codebuf[0]+=(short)(toRight(buf[1],0)>>4);
//codebuf[1]=(short)buf[2];
codebuf[1]=toRight(buf[2],0);
//codebuf[1]=(byte)(buf[1]<<4);
temp=(byte)(toRight(buf[1],4));
codebuf[1]+=toRight(temp,4);
// System.out.println(codebuf[0]+"\t"+codebuf[1]);
if(codebuf[0]<-1 ||codebuf[1]<-1)
{
System.out.println("erroring while getting the code
:"+codebuf[0]+"\t"+codebuf[1]);
System.out.println(dic);
return false;
}
//System.out.println(codebuf[0]+"\t"+codebuf[1]);
}
catch(IOException e )
{
System.err.println(e);
return false;
}
return true;
}
/**converte a byte number,to the short form;and
* shift a byte n bits to the right;and reglect whether
*&the byte is positive or negective
*@param byte:the byte you want to shift
* int :the bits you shift to the right
*@return int :the result of the shifted
*/ private short toRight(byte buf,int n)
{
short s=0;
for(short i=7;i>=0;i--)
{
if( ( (1L<<i)&buf )!=0 )
s+=(short)(1L<<(i+n));
}
return s;
}
/**output the String to a file,but in a form of "byte" way;
* in order to be ecactly as the oririnal file ,i deel with
* the file in bytes form
*@param BufferedOutputStream out:the output file
* String str:the buf of String to be output
*/ private void stringOut(BufferedOutputStream out,String str)
{
byte a[]=str.getBytes();
try{
out.write(a,0,str.length());
}
catch(IOException e )
{
System.err.println(e);
}
}
}
//Dictionary.java
package com.anywhere;
import java.util.*;
/**the Exception to indicate that the dictionary is too large
*/
class OutDictionaryException extends Exception
{
public String toString()
{
return (super.toString ()+"out of the dictionary size!!");
}
}
/**
a dictonry that contains at most 2^12 words,and should be inited
at the beginning; it can be looked up,can be added and return the size
@author :Lai Yongxuan 2002.3.10
@version :1.0
*/
public class Dictionary
{
/** the container of the dictionary,use ArrayList
*@see java.util.ArrayList
*/
ArrayList ar=new ArrayList();
/**the constuctor of the class,and put the 128 ASCII to the dictionary
*/
public Dictionary()
{
// byte i[]=new byte[1];
char c[]=new char[1];
for( c[0]=0;c[0]<128;c[0]++)
{
ar.add(new String(c));
}
}
/**return the index number of the word in the dictionary
*/
public int indexOf(String a)
{
return ar.indexOf(a);
}
/**add a string to the dictionary
@param String :the word to be added
@return NO returned value
@Exception OutDictionaryException is thrown if the dictionary is too
large ,it only can contain 4096(2^12) words at most
*/
public void add (String a) throws OutDictionaryException
{
if( length()<4096)
ar.add(a);
else
{
throw(new OutDictionaryException());
}
}
/** the size of the dictionary
*/
public int length()
{
return (short)ar.size();
}
public String toString()
{
Integer le=new Integer(length() );
String str="size of the dictionary: "+le.toString ()+"\n";
for(int i=0;i<length();i++)
str+=new String(i+": "+(String)ar.get(i)+"\t");
return str;
}
/** return the word by the index pointor
*/
public String getString(short i)
{
return (String)ar.get(i);
}
/** only to test the dictionary
*/
public static void main(String []args )
{
Dictionary a=new Dictionary();
/* try{
for(int i=128;i<6000;i++)
{
a.add(new String("i am a student") );
}
}
catch(Exception e)
{
System.err.println (e.toString());
}*/
System.out.println(a);
}
}
相关推荐
该算法基于字典编码思想,通过构建和更新动态字典来实现数据的压缩。在Java中实现LZW算法主要涉及以下几个关键步骤: 1. **初始化字典**: 在开始压缩过程之前,需要创建一个初始字典,通常包含所有可能的单个字符...
- LZ4和LZMA等现代压缩算法在速度和压缩率上可能优于LZW,但它们的原理和实现更为复杂。 总的来说,LZW压缩算法是数据压缩领域的重要技术,它通过构建动态字典来实现对数据的高效压缩。虽然有其局限性,但在很多...
LZW(Lempel-Ziv-Welch...通过研究和实践这个VC++源码,你不仅可以深入了解LZW压缩算法的实现细节,还能提升C++编程技巧,特别是文件操作和算法实现方面的能力。同时,这也为你提供了将理论知识应用于实际项目的基础。
总的来说,Java实现LZW压缩涉及到对LZW算法的理解,以及对数据结构和文件操作的掌握。这是一个很好的实践项目,可以帮助你深入理解数据压缩原理和Java编程技巧。通过分享自己的实现,你可以帮助其他学习者更好地理解...
总的来说,LZW算法是一种高效的无损压缩技术,其C和Java实现可以帮助开发者理解不同编程语言如何处理数据压缩问题。无论是为了学习,还是在实际项目中应用,熟悉LZW算法及其实现都是非常有价值的。
LZW(Lempel-Ziv-Welch)压缩...总之,LZW压缩算法通过识别和编码重复模式,实现了文件的有效压缩。通过理解和应用这种算法,我们可以创建自己的压缩程序,理解数据压缩的基本原理,并在实际项目中实现文件的快速压缩。
这种算法在许多领域都有应用,比如在文件压缩软件如GIF图像格式和早期的压缩程序如Compress中。现在,我们将深入探讨LZW算法的原理、实现步骤以及如何在Visual Studio 2013环境下编译。 LZW算法的核心思想是基于...
LZW(Lempel-Ziv-Welch)压缩算法是一种数据压缩方法,广泛应用于文本、图像和其他形式的数据。它的核心思想是通过构建一个字典来查找重复的模式,并用更短的编码来表示这些模式,从而实现数据压缩。在MATLAB环境中...
这是一个简单的LZW编码程序,能实现字典编码的基本工能!用码树实现!实现LZW编码和译码,任意数一段字符之后,就能实现对其的LZW编码,按照格式输入一段解码字符段,会解码出字符!
LZW(Lempel-Ziv-Welch)压缩算法是一种广泛应用的数据压缩算法,尤其在文本和图像文件的压缩中有着显著的效果。它基于字典编码的思想,通过将频繁出现的字符串编码为更短的码字来实现数据压缩。C++是实现这种算法的...
LZW(Lempel-Ziv-Welch)算法基于字典编码思想,它通过查找和更新一个动态字典来实现数据压缩。与Huffman编码不同,LZW不需要预先知道输入数据的概率分布,而是利用数据本身的统计特性进行压缩。其核心步骤包括编码...
- **实现简单**:算法逻辑相对简单,易于理解和实现。 - **通用性好**:适用于多种类型的数据,包括文本、图像等。 - **速度快**:由于采用了高效的查找机制,因此压缩和解压速度较快。 - **压缩效果好**:能够有效...
LZW(Lempel-Ziv-Welch)压缩...理解并掌握这个算法,对于理解和实现其他数据压缩技术,以及在实际应用中优化数据存储和传输效率都有重要意义。同时,利用GUI实现使得该工具更便于非专业人士使用,提高了其实用价值。
LZW(Lempel-Ziv-Welch)压缩算法是一种数据压缩方法,广泛应用于文本、图像和其他类型的数据。在VB(Visual Basic)环境下实现LZW压缩和解压缩,可以帮助开发者理解算法原理,并将其应用于实际项目中。以下是关于...
在这个多媒体技术教程中,我们将深入探讨LZW压缩算法的原理、编码与解码过程,并且会看到如何用C++语言来实现这一算法。 首先,LZW算法的基本思想是利用数据中的重复模式进行编码。在压缩过程中,数据被分割成一...
LZW(Lempel-Ziv-Welch)...理解并掌握LZW算法的工作原理和实现,对于从事计算机科学、尤其是数据处理和存储领域的专业人士来说是非常有价值的。通过深入学习和实践,可以更好地利用这种算法优化数据传输和存储效率。
信息论huffman编码 LZW编码 唯一可译码程序代码,希望与读者共同学习一下,有不足之处,敬请雅正。
看了就会的好资料,LZW压缩算法_很详细的压缩算法原理
4. 性能优化:优化算法实现,提高压缩和解压的速度,以适应实时监控系统高吞吐量的要求。 通过在FPGA上实现LZW改进压缩算法,并通过仿真验证设计的正确性,可以显著提高数据传输速度,这对于实时监控系统以及需要...
LZW(Lempel-Ziv-Welch)压缩...总之,LZW压缩算法在VC++中的实现是一个涉及数据结构、编码理论和实时系统设计的综合项目。通过理解和掌握这些知识点,开发者可以构建出高效、灵活的压缩工具,满足各种实际应用需求。