|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不得不提一下的是:.net是看到java红,而开发出来的工具。功能紧缩
Java供应了对字撙节举行紧缩息争紧缩的类。它们能够在java.util.zip包中被找到,同时也作为Jar文件的基础(Jar文件是具有一个清单的Zip文件)。
以下的程序接纳一个单一的输出文件,而且天生一个紧缩了的Zip输入文件,该程序带有一个暗示输出文件的出口项。
importjava.io.*;
importjava.util.zip.*;
publicclasscompress{
publicstaticvoiddoit(Stringfilein,Stringfileout){
FileInputStreamfis=null;
FileOutputStreamfos=null;
try{
fis=newFileInputStream(filein);
fos=newFileOutputStream(fileout);
ZipOutputStreamzos=newZipOutputStream(fos);
ZipEntryze=newZipEntry(filein);
zos.putNextEntry(ze);
finalintBUFSIZ=4096;
byteinbuf[]=newbyte[BUFSIZ];
intn;
while((n=fis.read(inbuf))!=-1)
zos.write(inbuf,0,n);
fis.close();
fis=null;
zos.close();
fos=null;
}
catch(IOExceptione){
System.err.println(e);
}
finally{
try{
if(fis!=null)
fis.close();
if(fos!=null)
fos.close();
}
catch(IOExceptione){
}
}
}
publicstaticvoidmain(Stringargs[]){
if(args.length!=2){
System.err.println("missingfilenames");
System.exit(1);
}
if(args[0].equals(args[1])){
System.err.println("filenamesareidentical");
System.exit(1);
}
doit(args[0],args[1]);
}
}
下一个程序恰好相反,接纳假定只要一个出口项的Zip输出文件,而且将该项解压到指定的输入文件:
importjava.io.*;
importjava.util.zip.*;
publicclassuncompress{
publicstaticvoiddoit(Stringfilein,Stringfileout){
FileInputStreamfis=null;
FileOutputStreamfos=null;
try{
fis=newFileInputStream(filein);
fos=newFileOutputStream(fileout);
ZipInputStreamzis=newZipInputStream(fis);
ZipEntryze=zis.getNextEntry();
finalintBUFSIZ=4096;
byteinbuf[]=newbyte[BUFSIZ];
intn;
while((n=zis.read(inbuf,0,BUFSIZ))!=-1)
fos.write(inbuf,0,n);
zis.close();
fis=null;
fos.close();
fos=null;
}
catch(IOExceptione){
System.err.println(e);
}
finally{
try{
if(fis!=null)
fis.close();
if(fos!=null)
fos.close();
}
catch(IOExceptione){
}
}
}
publicstaticvoidmain(Stringargs[]){
if(args.length!=2){
System.err.println("missingfilenames");
System.exit(1);
}
if(args[0].equals(args[1])){
System.err.println("filenamesareidentical");
System.exit(1);
}
doit(args[0],args[1]);
}
}
紧缩是有助仍是伤害I/O功能很年夜水平上依附于当地硬件设置;特别是处置器和磁盘驱动器的绝对速率。接纳Zip手艺举行紧缩,典范地将数据量削减50%,可是有一些紧缩息争压的工夫开支。在带IDE磁盘驱动器的300-MHzPentiumPC上,对一个年夜的紧缩文本文件(5-10MB)的实行标明,从磁盘读取紧缩文件比非紧缩文件快快要1/3。
充实展示紧缩优胜性的一个例子是在写进象软盘如许的低速介质。利用高速处置器(300MHzPentium)和低速软盘(PC上经常使用的软盘驱动器)举行的测试显现,紧缩一个年夜文本文件,然后写进软盘,比间接将文件拷贝到软盘快50%。
高速缓存
关于硬件的高速缓存的具体会商超越了本文的局限。可是,偶然软件高速缓存可以减速I/O。思索如许一个例子,必要以随机的体例读取文本文件的某些行。完成的办法之一是读进一切的行,而且把它们存储在ArrayList(一个与Vector类似的collection类)中:
importjava.io.*;
importjava.util.ArrayList;
publicclassLineCache{
privateArrayListlist=newArrayList();
publicLineCache(Stringfn)throwsIOException{
FileReaderfr=newFileReader(fn);
BufferedReaderbr=newBufferedReader(fr);
Stringln;
while((ln=br.readLine())!=null)
list.add(ln);
br.close();
}
publicStringgetLine(intn){
if(n<0)
thrownewIllegalArgumentException();
return(n<list.size()?
(String)list.get(n):null);
}
publicstaticvoidmain(Stringargs[]){
if(args.length!=1){
System.err.println("missingfilename");
System.exit(1);
}
try{
LineCachelc=newLineCache(args[0]);
inti=0;
Stringln;
while((ln=lc.getLine(i++))!=null)
System.out.println(ln);
}
catch(IOExceptione){
System.err.println(e);
}
}
}
getLine办法被用来检索恣意的一行。这项手艺十分有效,但关于年夜文件而言,明显必要利用了大批的内存,因而具有范围性。一个替换办法是仅仅记着比来被哀求的100行,需要时从磁盘上读取其他行。在存外行的存储部分性这类情形下,这个计划运转优秀,可是必要真实的随机存储时就没有这么好了。
标记化(Tokenization)
标记化(Tokenization)指将字节大概字符序列分离成象词一样的逻辑块的历程。Java供应了StreamTokenizer类,能够举行以下的操纵:
importjava.io.*;
publicclasstoken1{
publicstaticvoidmain(Stringargs[]){
if(args.length!=1){
System.err.println("missingfilename");
System.exit(1);
}
try{
FileReaderfr=newFileReader(args[0]);
BufferedReaderbr=newBufferedReader(fr);
StreamTokenizerst=newStreamTokenizer(br);
st.resetSyntax();
st.wordChars(a,z);
inttok;
while((tok=st.nextToken())!=
StreamTokenizer.TT_EOF){
if(tok==StreamTokenizer.TT_WORD)
;//st.svalhastoken
}
br.close();
}
catch(IOExceptione){
System.err.println(e);
}
}
}
本例依据小写字母(字母a-z)举行标志。假如由您本人完成了其等效程序,大概看上往象如许:
importjava.io.*;
publicclasstoken2{
publicstaticvoidmain(Stringargs[]){
if(args.length!=1){
System.err.println("missingfilename");
System.exit(1);
}
try{
FileReaderfr=newFileReader(args[0]);
BufferedReaderbr=newBufferedReader(fr);
intmaxlen=256;
intcurrlen=0;
charwordbuf[]=newchar[maxlen];
intc;
do{
c=br.read();
if(c>=a&&c<=z){
if(currlen==maxlen){
maxlen*=1.5;
charxbuf[]=
newchar[maxlen];
System.arraycopy(wordbuf,0,
xbuf,0,currlen);
wordbuf=xbuf;
}
wordbuf[currlen++]=(char)c;
}
else
if(currlen>0){
Strings=newString(wordbuf,0,
currlen);
//dosomethingwiths
currlen=0;
}
}while(c!=-1);
br.close();
}
catch(IOExceptione){
System.err.println(e);
}
}
}
首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。 |
|