|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在性能方面,在windows平台下,.net可能是占强项,要是把.net放在sun开发的操作系统上去运行呢?根本就运行不了,.net对其它操作系统的支持也很弱,性能也可能比不上java。【课前思索】
1.甚么是破例?Java中有哪两种破例处置机制?
2.字撙节和字符流的基类各是甚么?
3.甚么是对象的串行化?对象串行化的感化是甚么?
难点:
1.怎样利用Java中两种破例处置机制,丢弃破例和声明丢弃破例的区分与接洽。
2.处置字符流时,其机关办法的参数是一个字撙节。
3.对象串行化的观点。
4.1甚么是破例
4.1.2破例处置机制
丢弃(throw)破例:
在Java程序的实行过程当中,假如呈现了非常事务,就会天生一个破例对象。天生的破例对象将传送给Java运转时体系,这一破例的发生和提交历程称为丢弃(throw)破例。
两种处置破例的机制:
◇捕捉破例:
当Java运转时体系失掉一个破例对象时,它将会沿着办法的挪用栈逐层回溯,寻觅处置这一破例的代码。找到可以处置这类范例的破例的办法后,运转时体系把以后破例对象交给这个办法举行处置,这一历程称为捕捉(catch)破例。这是主动的破例处置机制。假如Java运转时体系找不到能够捕捉破例的办法,则运转时体系将停止,响应的Java程序也将加入。
◇声明丢弃破例:
假如一个办法其实不晓得怎样处置所呈现的破例,则可在办法声明时,声明丢弃(throws)破例。这是一种悲观的破例处置机制。
4.1.3破例类的条理
在jdk中,每一个包中都界说了破例类,而一切的破例类都间接或直接地承继于Throwable类。-1为jdk中破例类的承继干系。
java中的破例类可分为两年夜类:
Error
静态链接失利,假造机毛病等,一般Java程序不该该捕捉这类破例,也不会丢弃这类破例。
Exception
1)运转时破例:
承继于RuntimeException的类都属于运转时破例,比方算术破例(除零错)、数组下标越界破例等等。因为这些破例发生的地位是未知的,Java编译器同意程序员在程序中不合错误它们做出处置。
2)非运转时破例:
除运转时破例以外的其他由Exception承继来的破例类都长短运转时的破例,比方FileNotFoundException(文件未找到破例)。Java编译器请求在程序中必需处置这类破例,捕捉破例大概声明丢弃破例。
4.2破例的处置
4.2.1捕捉破例
捕捉破例是经由过程try-catch-finally语句完成的:
try{
......
}catch(ExceptionName1e){
......
}catch(ExceptionName2e){
......
}
......
}finally{
......
}
◇try
捕捉破例的第一步是用try{…}选定捕捉破例的局限,由try所限制的代码块中的语句在实行过程当中大概会天生破例对象并丢弃。
◇catch
每一个try代码块能够陪伴一个或多个catch语句,用于处置try代码块中所天生的破例事务。catch语句只必要一个情势参数指明它所可以捕捉的破例范例,这个类必需是Throwable的子类,运转时体系经由过程参数值把被丢弃的破例对象传送给catch块。
在catch块中是对破例对象举行处置的代码,与会见别的对象一样,能够会见一个破例对象的变量或挪用它的办法。getMessage()是类Throwable所供应的办法,用来失掉有关非常事务的信息,类Throwable还供应了办法printStackTrace()用来跟踪非常事务产生时实行仓库的内容。比方:
try{
......
}catch(FileNotFoundExceptione){
System.out.println(e);
System.out.println("message:"+e.getMessage());
e.printStackTrace(System.out);
}catch(IOExceptione){
System.out.println(e);
}
catch语句的按次:
捕捉破例的按次和catch语句的按次有关,当捕捉到一个破例时,剩下的catch语句就不再举行婚配。因而,在布置catch语句的按次时,起首应当捕捉最特别的破例,然后再渐渐一样平常化。也就是一样平常先布置子类,再布置父类。
◇finally
捕捉破例的最初一步是经由过程finally语句为破例处置供应一个一致的出口,使得在把持流转到程序的别的部分之前,可以对程序的形态作一致的办理。不管在try代码块中是不是产生了非常事务,finally块中的语句城市被实行。
4.2.2声明丢弃破例
1.声明丢弃破例
假如在一个办法中天生了一个破例,可是这一办法其实不切实地晓得该怎样对这一非常事务举行处置,这时候,一个办法就应当声明丢弃破例,使得破例对象能够从挪用栈向后传布,直到有符合的办法捕捉它为止。
声明丢弃破例是在一个办法声明中的throws子句中指明的。比方:
publicintread()throwsIOException{
......
}
throws子句中同时能够指明多个破例,之间由逗号离隔。比方:
publicstaticvoidmain(Stringargs[])throws
IOException,IndexOutOfBoundsException{…}
2.抛出破例
抛出破例就是发生破例对象的历程,起首要天生破例对象,破例大概由假造机天生,大概由某些类的实例天生,也能够在程序中天生。在办法中,抛出破例对象是经由过程throw语句完成的。
比方:
IOExceptione=newIOException();
throwe;
能够抛出的破例必需是Throwable或其子类的实例。上面的语句在编译时将会发生语法毛病:
thrownewString("wanttothrow");
4.3自界说破例类的利用
自界说破例类必需是Throwable的间接或直接子类。
注重:一个办法所声明丢弃的破例是作为这个办法与外界交互的一部分而存在的。以是,办法的挪用者必需懂得这些破例,并断定怎样准确的处置他们。
4.4I/O流概述
输出/输入处置是程序计划中十分主要的一部分,好比从键盘读取数据、从文件中读取数据或向文件中写数据等等。Java把这些分歧范例的输出、输入源笼统为流(stream),用一致接口来暗示,从而使程序复杂了然。Jdk供应了包java.io,个中包含一系列的类来完成输出/输入处置。上面我们对java.io包的内容举行提要的先容。
4.4.1I/O流的条理
1.字撙节:
从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基础处置单元。
◇InputStream、OutputStream
◇FileInputStream、FileOutputStream
◇PipedInputStream、PipedOutputStream
◇ByteArrayInputStream、ByteArrayOutputStream
◇FilterInputStream、FilterOutputStream
◇DataInputStream、DataOutputStream
◇BufferedInputStream、BufferedOutputStream
2.字符流:
从Reader和Writer派生出的一系列类,这类流以16位的Unicode码暗示的字符为基础处置单元。
◇Reader、Writer
◇InputStreamReader、OutputStreamWriter
◇FileReader、FileWriter
◇CharArrayReader、CharArrayWriter
◇PipedReader、PipedWriter
◇FilterReader、FilterWriter
◇BufferedReader、BufferedWriter
◇StringReader、StringWriter
3.对象流
◇ObjectInputStream、ObjectOutputStream
4.别的
◇文件处置:
File、RandomAccessFile;
◇接口
DataInput、DataOutput、ObjectInput、ObjectOutput;
4.4.2InputStream和OutputStream
1.InputStream
◇从流中读取数据:
intread();//读取一个字节,前往值为所读的字节
intread(byteb[]);//读取多个字节,安排到字节数组b中,一般
//读取的字节数目为b的长度,前往值为实践
//读取的字节的数目
intread(byteb[],intoff,intlen);//读取len个字节,安排
//到以下标off入手下手字节
//数组b中,前往值为实
//际读取的字节的数目
intavailable(); //前往值为流中还没有读取的字节的数目
longskip(longn);//读指针跳过n个字节不读,前往值为实践
//跳过的字节数目
◇封闭流:
close();//流操纵终了后必需封闭
◇利用输出流中的标志:
voidmark(intreadlimit);//纪录以后读指针地点地位,readlimit
//暗示读指针读出readlimit个字节后
//所标志的指针地位才生效
voidreset(); //把读指针从头指向用mark办法所纪录的地位
booleanmarkSupported(); //以后的流是不是撑持读指针的纪录功效
2.OutputStream
◇输入数据:
voidwrite(intb); //往流中写一个字节b
voidwrite(byteb[]);//往流中写一个字节数组b
voidwrite(byteb[],intoff,intlen);//把字节数组b中从
//下标off入手下手,长度为len的字节写进流中
◇flush() //刷空输入流,并输入一切被缓存的字节
因为某些流撑持缓存功效,该办法将把缓存中一切内容强迫输入到流中。
◇封闭流:
close(); //流操纵终了后必需封闭
4.4.3I/O中的破例
举行I/O操纵时大概会发生I/O破例,属于非运转时破例,应当在程序中处置。如:FileNotFoundException,EOFException,IOException。
4.5文件处置
I/O处置中,最多见的是对文件的操纵,java.io包中有关文件处置的类有:File、FileInputStream、FileOutputStream、RamdomAccessFile和FileDescriptor;接口有:FilenameFilter。
4.5.1文件形貌
类File供应了一种与呆板有关的体例来形貌一个文件对象的属性。上面我们先容类File中供应的各类办法。
◇文件或目次的天生
publicFile(Stringpath);/*假如path是实践存在的路径,则该File对象
/*暗示的是目次;假如path是文件名,则该File对象暗示的是文件。*/
publicFile(Stringpath,Stringname);//path是路径名,name是文件名
publicFile(Filedir,Stringname);//dir是路径名,name是文件名
◇文件名的处置
StringgetName();//失掉一个文件的称号(不包含路径)
StringgetPath();//失掉一个文件的路径名
StringgetAbsolutePath();//失掉一个文件的相对路径名
StringgetParent();//失掉一个文件的上一级目次名
StringrenameTo(FilenewName);//将以后文件名改名为给定文件的
完全路径
◇文件属性测试
booleanexists();//测试以后File对象所唆使的文件是不是存在
booleancanWrite();//测试以后文件是不是可写
booleancanRead();//测试以后文件是不是可读
booleanisFile();//测试以后文件是不是是文件(不是目次)
booleanisDirectory();//测试以后文件是不是是目次
◇一般文件信息和工具
longlastModified();//失掉文件比来一次修正的工夫
longlength();//失掉文件的长度,以字节为单元
booleandelete();//删除以后文件
◇目次操纵
booleanmkdir();//依据以后对象天生一个由该对象指定的路径
Stringlist();//列出以后目次下的文件
在java的windows编程中,目次用以下情势:Filedir=newFile("e://myapp//src");
4.5.2文件的按次处置
类FileInputStream和FileOutputStream用来举行文件I/O处置,由它们所供应的办法能够翻开当地主机上的文件,并举行按次的读/写。比方,以下的语句段是按次读取文件名为text的文件里的内容,并显现在把持台下面,直到文件停止为止。
FileInputStreamfis;
try{
fis=newFileInputStream("text");
System.out.print("contentoftextis:");
intb;
while((b=fis.read())!=-1)//按次读取文件text里的内容并赋值
给整型变量b,直到文件停止为止。
{
System.out.print((char)b);
}
}catch(FileNotFoundExceptione){
System.out.println(e);
}catch(IOExceptione){
System.out.println(e);
}
4.5.3随机会见文件
关于InputStream和OutputStream来讲,它们的实例都是按次会见流,也就是说,只能对文件举行按次地读/写。随机会见文件则同意对文件内容举行随机读/写。在java中,类RandomAccessFile供应了随机会见文件的办法。类RandomAccessFile的声明为:
publicclassRandomAccessFileextendsObjectimplementsDataInput,DataOutput
接口DataInput中界说的办法次要包含从流中读取基础范例的数据、读取一行数据、大概读取指定长度的字节数。如:readBoolean()、readInt()、readLine()、readFully()等。
接口DataOutput中界说的办法次要是向流中写进基础范例的数据、大概写进必定长度的字节数组。如:writeChar()、writeDouble()、write()等。上面具体先容RandomAccessFile类中的办法。
◇机关办法:
RandomAccessFile(Stringname,Stringmode);//name是文件名,mode
//是翻开体例,比方"r"暗示只读,"rw"暗示可读写,"
RandomAccessFile(Filefile,Stringmode);//file是文件对象
◇文件指针的操纵
longgetFilePointer();//用于失掉以后的文件指针
voidseek(longpos);//用于挪动文件指针到指定的地位
intskipBytes(intn);//使文件指针向前挪动指定的n个字节
4.6过滤流
过滤流在读/写数据的同时能够对数据举行处置,它供应了同步机制,使得某一时候只要一个线程能够会见一个I/O流,以避免多个线程同时对一个I/O流举行操纵所带来的意想不到的了局。类FilterInputStream和FilterOutputStream分离作为一切过滤输出流和输入流的父类。
为了利用一个过滤流,必需起首把过滤留连接到某个输出/出流上,一般经由过程在机关办法的参数中指定所要毗连的输出/出流来完成。比方:
FilterInputStream(InputStreamin);
FilterOutputStream(OutputStreamout);
几种罕见的过滤流:
◇BufferedInputStream和BufferedOutputStream
缓冲流,用于进步输出/输入处置的效力。
◇DataInputStream和DataOutputStream
不但能读/写数据流,并且能读/写各类的java言语的基础范例,如:boolean,int,float等。
◇LineNumberInputStream
除供应对输出处置的撑持外,LineNumberInputStream能够纪录以后的行号。
◇PushbackInputStream
供应了一个办法能够把刚读过的字节退回到输出流中,以便从头再读一遍。
◇PrintStream
打印流的感化是把Java言语的内构范例以其字符暗示情势送到响应的输入流。
4.7字符流的处置
java中供应了处置以16位的Unicode码暗示的字符流的类,即以Reader和Writer为基类派生出的一系列类。
4.7.1Reader和Writer
这两个类是笼统类,只是供应了一系列用于字符流处置的接口,不克不及天生这两个类的实例,只能经由过程利用由它们派生出来的子类对象来处置字符流。
1.Reader类是处置一切字符流输出类的父类。
◇读取字符
publicintread()throwsIOException;//读取一个字符,前往值为读取的字符
publicintread(charcbuf[])throwsIOException;/*读取一系列字符到数组cbuf[]中,前往值为实践读取的字符的数目*/
publicabstractintread(charcbuf[],intoff,intlen)throwsIOException;
/*读取len个字符,从数组cbuf[]的下标off处入手下手寄存,前往值为实践读取的字符数目,该办法必需由子类完成(由于是笼统办法,不然类必需声明为笼统类)*/
◇标志流
publicbooleanmarkSupported();//判别以后流是不是撑持做标志
publicvoidmark(intreadAheadLimit)throwsIOException;
//给以后流作标志,最多撑持readAheadLimit个字符的回溯。
publicvoidreset()throwsIOException;//将以后流重置到做标志处
◇封闭流
publicabstractvoidclose()throwsIOException;
2.Writer类是处置一切字符流输入类的父类。
◇向输入流写进字符
publicvoidwrite(intc)throwsIOException;
//将整型值c的低16位写进输入流
publicvoidwrite(charcbuf[])throwsIOException;
//将字符数组cbuf[]写进输入流
publicabstractvoidwrite(charcbuf[],intoff,intlen)throwsIOException;
//将字符数组cbuf[]中的从索引为off的地位处入手下手的len个字符写进输入流
publicvoidwrite(Stringstr)throwsIOException;
//将字符串str中的字符写进输入流
publicvoidwrite(Stringstr,intoff,intlen)throwsIOException;
//将字符串str中从索引off入手下手处的len个字符写进输入流
◇flush()
刷空输入流,并输入一切被缓存的字节。
◇封闭流
publicabstractvoidclose()throwsIOException;
4.7.2InputStreamReader和OutputStreamWriter
java.io包顶用于处置字符流的最基础的类,用来在字撙节和字符流之间作为中介。
◇天生流对象
publicInputStreamReader(InputStreamin);
/*in是字撙节,而InputStreamReader是字符流,可是其来历是字撙节in,
因而InputStreamReader就能够把字撙节in转换成字符流处置。/*
publicInputStreamReader(InputStreamin,Stringenc)throwsUnsupportedEncodingException;
/*enc是编码体例,就是从字撙节到字符流举行转换时所接纳的编码体例,
比方ISO8859-1,UTF-8,UTF-16等等*/
publicOutputStreamWriter(OutputStreamout);
/*out是字撙节,而OutputStreamReader是字符流*/
publicOutputStreamWriter(OutputStreamout,Stringenc)throwsUnsupportedEncodingException;//enc是编码体例
InputStreamReader和OutputStreamWriter的办法:
◇读进和写出字符
基础同Reader和Writer。
◇猎取以后编码体例
publicStringgetEncoding();
◇封闭流
publicvoidclose()throwsIOException;
4.7.3BufferedReader和BufferedWriter
◇天生流对象
publicBufferedReader(Readerin);//利用缺省的缓冲区巨细
publicBufferedReader(Readerin,intsz);//sz为缓冲区的巨细
publicBufferedWriter(Writerout);
publicBufferedWriter(Writerout,intsz);
◇读进/写出字符
除Reader和Writer中供应的基础的读写办法外,增添对整行字符的处置。
publicStringreadLine()throwsIOException;//读一行字符
publicvoidnewLine()throwsIOException;//写一行字符
【例4-4】
InputStreamReaderir;
BufferedReaderin;
ir=newInputStreamReader(System.in);
//从键盘吸收了一个字符串的输出,并创立了一个字符输出流的对象,in的定//义以下:publicstaticfinalInputStreamin,输入流out的界说以下:publicstaticfinal//PrintStreamout
in=newBufferedReader(ir);
Strings=in.readLine();
//从输出流in中读进一行,并将读取的值赋值给字符串变量s
System.out.println("Inputvalueis:"+s);
注重:在读取字符流时,假如不是来自于当地的,好比说来自于收集上某处的与当地编码体例分歧的呆板,那末我们在机关输出流时就不克不及复杂地利用当地缺省的编码体例,不然读出的字符就不准确;为了准确地读出异种机上的字符,我们应当利用下述体例机关输出流对象:
ir=newInputStreamReader(is,"8859_1");
接纳ISO8859_1编码体例,这是一种映照到ASCII码的编码体例,能够在分歧平台之间准确转换字符。
4.8对象的串行化
4.8.1串行化的界说
1.甚么是串行化
对象的寿命一般跟着天生该对象的程序的停止而停止。偶然候,大概必要将对象的形态保留上去,在必要时再将对象恢复。我们把对象的这类能纪录本人的形态以便未来再生的才能,叫做对象的延续性(persistence)。对象经由过程写出形貌本人形态的数值来纪录本人,这个历程叫对象的串行化(Serialization)。
2.串行化的目标
串行化的目标是为java的运转情况供应一组特征,其次要义务是写出对象实例变量的数值。
4.8.2串行化办法
在java.io包中,接口Serializable用来作为完成对象串行化的工具,只要完成了Serializable的类的对象才能够被串行化
1.界说一个可串行化对象
publicclassStudentimplementsSerializable{
intid;//学号
Stringname;//姓名
intage;//岁数
Stringdepartment//系别
publicStudent(intid,Stringname,intage,Stringdepartment){
this.id=id;
this.name=name;
this.age=age;
this.department=department;
}
}
2.机关对象的输出/输入流
要串行化一个对象,必需与必定的对象输出/输入流接洽起来,经由过程对象输入流将对象形态保留上去,再经由过程对象输出流将对象形态恢复。
java.io包中,供应了ObjectInputStream和ObjectOutputStream将数据流功效扩大至可读写对象。在ObjectInputStream顶用readObject()办法能够间接读取一个对象,ObjectOutputStream顶用writeObject()办法能够间接将对象保留到输入流中。
Studentstu=newStudent(981036,"LiuMing",18,"CSD");
FileOutputStreamfo=newFileOutputStream("data.ser");
//保留对象的形态
ObjectOutputStreamso=newObjectOutputStream(fo);
try{
so.writeObject(stu);
so.close();
}catch(IOExceptione)
{System.out.println(e);}
FileInputStreamfi=newFileInputStream("data.ser");
ObjectInputStreamsi=newObjectInputStream(fi);
//恢复对象的形态
try{
stu=(Student)si.readObject();
si.close();
}catch(IOExceptione)
{System.out.println(e);}
在这个例子中,我们起首界说一个类Student,完成了Serializable接口,然后经由过程对象输入流的writeObject()办法将Student对象保留到文件data.ser中。以后,经由过程对象输出流的readObject()办法从文件data.ser中读出保留上去的Student对象。
4.8.3串行化的注重事项
1.串行化能保留的元素
只能保留对象的非静态成员变量,不克不及保留任何的成员办法和静态的成员变量,并且串行化保留的只是变量的值,关于变量的任何润色符,都不克不及保留。
2.transient关头字
关于某些范例的对象,其形态是瞬时的,如许的对象是没法保留其形态的,比方一个Thread对象,或一个FileInputStream对象,关于这些字段,我们必需用transient关头字标明,见3.2.1节
3.定制串行化
缺省的串行化机制,对象串行化起首写进类数据和类字段的信息,然后依照称号的上升分列按次写进其数值。假如想本人明白地把持这些数值的写进按次和写进品种,必需界说本人的读取数据流的体例。就是在类的界说中重写接口serializeble的writeObject()和readObject()办法。
比方可在4.8.2的例子中,到场重写的writeObject()和readObject()办法,对Student类定制其串行化。
privatevoidwriteObject(ObjectOutputStreamout)throwsIOException
{
out.writeInt(id);
out.writeInt(age);
out.writeUTF(name);
out.writeUTF(department);
}
privatevoidreadObject(ObjectInputStreamin)throwsIOException
{
id=in.readInt();
age=in.readInt();
name=in.readUTF();
department=in.readUTF();
}
4.9别的经常使用的流
4.9.1管道流
管道用来把一个程序、线程或代码块的输入毗连到另外一个程序、线程或代码块的输出。
管道输出流作为一个通讯管道的吸收端,管道输入流作为发送端。在利用管道之前,管道输入流和管道输出流必需举行毗连。上面有两种毗连的办法:
1.机关办法中毗连
PipedInputStream(PipedOutputStreamsrc);
PipedOutputStream(PipedInputStreamsnk);
2.connect()办法举行毗连
类PipedInputStream中界说为:
voidconnect(PipedOutputStreamsrc);
类PipedOutputStream中界说为:
voidconnect(PipedInputStreamsnk);
4.9.2内存的读/写
1.ByteArrayInputStream和ByteArrayOutputStream
ByteArrayInputStream//从字节数组中读取以字节为单元的数据
ByteArrayOutputStream//向字节数组中写进以字节为单元的数据
2.StringBufferInputStream和StringBufferOutputStream
StringBufferInputStream
//从字符串缓冲区StringBuffer中读取以字符为单元的数据
StringBufferOutputStream
//向字符串缓冲区StringBuffer中写进以字符为单元的数据
4.9.3按次输出流
SequenceInputStream把几个输出流按次毗连起来。按次输出流供应了把多少分歧的流一致为统一个流的功效,使得程序变得加倍简便。
不得不提一下的是:.net是看到java红,而开发出来的工具。 |
|