JAVA网站制作之调剂JavaTM 的I/O功能(三)(zt)
不得不提一下的是:.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;
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.equals(args)){
System.err.println("filenamesareidentical");
System.exit(1);
}
doit(args,args);
}
}
下一个程序恰好相反,接纳假定只要一个出口项的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;
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.equals(args)){
System.err.println("filenamesareidentical");
System.exit(1);
}
doit(args,args);
}
}
紧缩是有助仍是伤害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);
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);
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);
BufferedReaderbr=newBufferedReader(fr);
intmaxlen=256;
intcurrlen=0;
charwordbuf[]=newchar;
intc;
do{
c=br.read();
if(c>=a&&c<=z){
if(currlen==maxlen){
maxlen*=1.5;
charxbuf[]=
newchar;
System.arraycopy(wordbuf,0,
xbuf,0,currlen);
wordbuf=xbuf;
}
wordbuf=(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的复杂性。 是一种为 Internet发展的计算机语言 应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展 是一种使用者不需花费很多时间学习的语言 Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。 是一种使用者不需花费很多时间学习的语言 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展 设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。 Java是一种计算机编程语言,拥有跨平台、面向对java 自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。 自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。 Java 编程语言的风格十分接近C、C++语言。 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
页:
[1]