|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
Java的桌面程序开发在java程序员里通常叫swing开发,主要用的swing包里的类开发的,也就是通常说的c/s架构开发功能第二个程序比第一个约莫快20%,价值是不能不写一些技能性的底层代码。
StreamTokenizer是一个杂和的类,由于它从基于字符的流中读取(象BufferedReader)数据,但同时又以字节进行操纵,即只管它们是字母,也要用两字节的值来处置一切的字符(年夜于0xff)。
序列化
序列化利用一个尺度格局,将恣意一个Java数据布局转换为字撙节。比方,以下程序输入一个随机的整数数组:
importjava.io.*;
importjava.util.*;
publicclassserial1{
publicstaticvoidmain(Stringargs[]){
ArrayListal=newArrayList();
Randomrn=newRandom();
finalintN=100000;
for(inti=1;i<=N;i++)
al.add(newInteger(rn.nextInt()));
try{
FileOutputStreamfos=
newFileOutputStream("test.ser");
BufferedOutputStreambos=
newBufferedOutputStream(fos);
ObjectOutputStreamoos=
newObjectOutputStream(bos);
oos.writeObject(al);
oos.close();
}
catch(Throwablee){
System.err.println(e);
}
}
}
而上面的程序又将该数组从头读进:
importjava.io.*;
importjava.util.*;
publicclassserial2{
publicstaticvoidmain(Stringargs[]){
ArrayListal=null;
try{
FileInputStreamfis=
newFileInputStream("test.ser");
BufferedInputStreambis=
newBufferedInputStream(fis);
ObjectInputStreamois=
newObjectInputStream(bis);
al=(ArrayList)ois.readObject();
ois.close();
}
catch(Throwablee){
System.err.println(e);
}
}
}
请注重我们利用了缓冲手艺来减速I/O操纵。
这里是不是存在比序列化更快的办法来输入年夜容量的数据,然后又读取返来?除极一般的例子外,大概没有。比方,假定您必要以文本情势输入一个64位长的整数,而不是8字节的汇合。作为文本情势的一个长整数的最年夜长度约莫是20个字符,也就是二进制暗示的2.5倍。因而,看上往这类格局仿佛不成能更快。但是,在某些情形下,比方位图,一种特定的格局多是一种改善的办法。但是,利用本人的计划会与序列化供应的尺度相抵触,因而,如许做不能不触及一些衡量。
除序列化(接纳DataInputStream和DataOutputStream)实践的I/O和格局化开支外,另有其他价值,比方,当解除序列化时必要创立新的对象。
请注重DataOutputStream的办法大概被用来开辟半定制(semi-custom)的数据格局,比方:
importjava.io.*;
importjava.util.*;
publicclassbinary1{
publicstaticvoidmain(Stringargs[]){
try{
FileOutputStreamfos=
newFileOutputStream("outdata");
BufferedOutputStreambos=
newBufferedOutputStream(fos);
DataOutputStreamdos=
newDataOutputStream(bos);
Randomrn=newRandom();
finalintN=10;
dos.writeInt(N);
for(inti=1;i<=N;i++){
intr=rn.nextInt();
System.out.println(r);
dos.writeInt(r);
}
dos.close();
}
catch(IOExceptione){
System.err.println(e);
}
}
}
和:
importjava.io.*;
publicclassbinary2{
publicstaticvoidmain(Stringargs[]){
try{
FileInputStreamfis=
newFileInputStream("outdata");
BufferedInputStreambis=
newBufferedInputStream(fis);
DataInputStreamdis=
newDataInputStream(bis);
intN=dis.readInt();
for(inti=1;i<=N;i++){
intr=dis.readInt();
System.out.println(r);
}
dis.close();
}
catch(IOExceptione){
System.err.println(e);
}
}
}
这些程序向文件写进10个整数,然后读出。
猎取文件信息
到今朝为止,会商仅触及对单个文件的输出和输入。可是,还存在减速I/O功能的另外一方面,这与查找文件属性有关。比方,思索一个打印文件长度的小程序:
importjava.io.*;
publicclasslength1{
publicstaticvoidmain(Stringargs[]){
if(args.length!=1){
System.err.println("missingfilename");
System.exit(1);
}
Filef=newFile(args[0]);
longlen=f.length();
System.out.println(len);
}
}
Java运转时体系本身是没法晓得文件长度的,因此必需扣问底层操纵体系以取得相干信息。关于其他文件信息也是云云,比方文件是不是是一个目次,最初修正工夫等等。在java.io包中的File类供应了一套查询这些信息的办法。如许的查询一般在必要很长的工夫,因而应当只管罕用。
查询文件信息的一个较长的例子是从文件体系的根目次入手下手举行递回遍历,以输入体系中一切的文件及其路径,该例子看上往象如许:
importjava.io.*;
publicclassroots{
publicstaticvoidvisit(Filef){
System.out.println(f);
}
publicstaticvoidwalk(Filef){
visit(f);
if(f.isDirectory()){
Stringlist[]=f.list();
for(inti=0;i<list.length;i++)
walk(newFile(f,list[i]));
}
}
publicstaticvoidmain(Stringargs[]){
Filelist[]=File.listRoots();
for(inti=0;i<list.length;i++){
if(list[i].exists())
walk(list[i]);
else
System.err.println("notaccessible:"
+list[i]);
}
}
}
这个例子利用了File类的办法,比方isDirectory和exists,来遍历目次布局。每一个文件按照其范例(一般文件或目次)仅被查询一次。
更多的信息
站点:
JavatmI/OPerformanceTuning
举例申明了进步I/O功能的一些办法。部分手艺与在下面所提到的对照类似,其他的则触及究竟层处置成绩。
DonKnuth的著作,TheArtofComputerProgramming,第3卷,会商了内部排序和搜刮算法,比方对B-树的利用。
你说是sun公司对她研究的透还是微软?针对自己工具开发的.net性能上肯定会站上风的。 |
|