第5章-输入输出流和异常-面向对象程序设计-Java-教学课件_第1页
第5章-输入输出流和异常-面向对象程序设计-Java-教学课件_第2页
第5章-输入输出流和异常-面向对象程序设计-Java-教学课件_第3页
第5章-输入输出流和异常-面向对象程序设计-Java-教学课件_第4页
第5章-输入输出流和异常-面向对象程序设计-Java-教学课件_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章输入输出流和异常1第5章输入输出流和异常1本章主要内容问题的提出与分析流的概念字节流的分类及其常用方法字符流的分类及其常用方法异常的概念Java的异常处理机制用户异常的定义和实现2本章主要内容问题的提出与分析25.1问题的提出与分析问题的提出ASCII编码Unicode编码Unicode编码与字符之间的转换35.1问题的提出与分析问题的提出3第5章-输入输出流和异常-面向对象程序设计-Java-教学课件第5章-输入输出流和异常-面向对象程序设计-Java-教学课件5.1问题的提出与分析用UML图描述的类之间的关系65.1问题的提出与分析用UML图描述的类之间的关系65.1问题的提出与分析最终程序的运行界面75.1问题的提出与分析最终程序的运行界面75.2输入输出流5.2.1流的概念将输入输出过程抽象为数据流数据源,数据宿特性:顺序性:先从数据源流出的数据一定比后流出的数据先到达数据宿单向性:数据只能从数据源流向数据宿唯一性:数据流必须而且只能和一个数据源与一个数据宿相连85.2输入输出流5.2.1流的概念85.2输入输出流5.2.2输入输出流类层次InputStreamStringBufferInputStreamSequenceInputStreamByteArrayInputStreamFilterInputStreamPipedInputStreamFileInputStreamProgressMonitorInputStreamInflateInputStreamDigestInputStreamCipherInputStreamCheckedInputStreamPushbackInputStreamBufferedInputStreamDataInputStreamLineNumberInputStream字节输入流类的层次关系95.2输入输出流5.2.2输入输出流类层次InputSt5.2输入输出流5.2.2输入输出流类层次字节输出流类的层次关系OutputStreamByteArrayOutputStreamFilterOutputStreamPipedOutputStreamFileOutputStreamPrintStreamBufferedOutputStreamDataOutputStream105.2输入输出流5.2.2输入输出流类层次字节输出流类的5.2输入输出流5.2.2输入输出流类层次字符输入流类的层次关系PushbackReaderFineReaderLineNumberReaderReaderStringReaderFilterReaderCharArrayReaderBufferedReaderInputStreamReaderPipedReader115.2输入输出流5.2.2输入输出流类层次字符输入流类的5.2输入输出流5.2.2输入输出流类层次字符输出流类的层次关系FineWriterWriterStringWriterFilterWriterCharArrayWriterBufferedWriterOutputStreamWriterPipedWriterPrintWriter125.2输入输出流5.2.2输入输出流类层次字符输出流类的5.2输入输出流例5-1,一个封装了缓冲输入流的类:sourceimportjava.io.*;classsource{privateBufferedInputStreambis;publicsource(Stringfilename){//构造方法//判断是否从键盘读if(filename.toLowerCase().compareTo("stdin")==0)bis=newBufferedInputStream(System.in);//建立缓冲区键盘输入流对象else{try{//异常结构,在本章的后面中介绍//建立缓冲区文件输入流对象bis=newBufferedInputStream(newFileInputStream(filename));}catch(Exceptione){}//异常结构在本章的后面中介绍}}publicStringreadaline(){//从输入流中读入一行字符return(null);//此处为预留功能,后面将添加具体实现}publicvoidclose(){}//关闭输入流}135.2输入输出流例5-1,一个封装了缓冲输入流的类:sou5.2输入输出流例5-2,一个封装了缓冲输出流的类:sinkimportjava.io.*;classsink{privateBufferedOutputStreambos;publicsink(Stringfilename){//构造方法//判断是否向屏幕写if(filename.toLowerCase().compareTo("stdout")==0)bos=newBufferedOutputStream(System.out);//建立缓冲区屏幕输出流对象else{try{//异常结构在本章的后面中介绍//建立缓冲区文件输出流对象bos=newBufferedOutputStream(newFileOutputStream(filename));}catch(Exceptione){}//异常结构在本章的后面中介绍}}publicvoidwritealine(Strings){}//向输出流中写入一行字符publicvoidclose(){}//关闭输出流}145.2输入输出流例5-2,一个封装了缓冲输出流的类:sin5.2输入输出流例5-3,trans程序的的main方法:publicclasstrans{publicstaticvoidmain(String[]args){//检查是否输入了三个参数,并且第三个参数只是一个字符if((args.length!=3)||(args[2].length()!=1)){printInfo();//输出本程序的使用方法System.exit(0);//结束运行}chartransmode;//用于保存命令行的第三个参数,即进行何种种转换transmode=args[2].charAt(0);//从命令行获取第三个参数//根据第三个参数值用不同的参数调用doTrans方法实现代编码转换switch(transmode){case'U':case'u'://将Unicode码转换成字符;System.out.println("实现Unicode码转换成字符的工作尚未完成");doTrans(args[0],args[1],1);//调用doTrans方法将Unicode码转换成字符;break;155.2输入输出流例5-3,trans程序的的main方法:5.2输入输出流例5-3,trans程序的的main方法(续):case'C':case'c'://将字符转换成Unicode码System.out.println("实现字符转换成Unicode码的工作尚未完成");doTrans(args[0],args[1],2);//调用doTrans方法将字符转换成Unicode码;break;case'N':case'n'://不进行转换System.out.println("实现文件复制的工作尚未完成");doTrans(args[0],args[1],0);//调用doTrans方法实现文件复制;break;default:printInfo();//输出本程序的使用方法System.exit(0);//结束运行}}165.2输入输出流例5-3,trans程序的的main方法(5.2输入输出流例5-3,trans程序的的main方法(续):staticvoiddoTrans(Stringinfile,Stringoutfile,intflag){Stringlinein,lineout="";sourcesin=newsource(infile);//根据第一个参数构造一个输入流类sinksout=newsink(outfile);//根据第二个参数构造一个输出流类linein=sin.readaline();//读入一行字符到linein中while(linein!=null){//如果linein不为空,则对其进行处理if(flag==1){//将Unicode码转换成字符的程序将在后面实现;}elseif(flag==2){//将字符转换成Unicode码的程序将在后面实现;}elseif(flag==0){//实现文件复制的程序将在后面实现;}sout.writealine(lineout);//将lineout写出到输出流中linein=sin.readaline();//读入下一行字符到linein中}sin.close();//关闭输入流sout.close();//关闭输出流}175.2输入输出流例5-3,trans程序的的main方法(5.2输入输出流例5-3,trans程序的的main方法(续):staticvoidprintInfo(){System.out.println("正确的格式是:javatrans<数据源><数据宿><转换方式>");System.out.println("数据源可以是stdin代表键盘,或者文件名");System.out.println("数据源可以是stdout代表屏幕,或者文件名");System.out.println("转换方式可以U,代表将Unicode码转换成字符;或者C,代表将字符转换成Unicode码;或者N表示不进行换");}}185.2输入输出流例5-3,trans程序的的main方法(5.2输入输出流5.2.3字节流从字节输入流中读数据intread();intread(byte[]buffer);intread(byte[]buffer,intoffset,intlength);向字节输出流中写数据voidwrite(intb);voidwrite(byte[]buffer);voidwrite(byte[]buffer,intoffset,intlength);195.2输入输出流5.2.3字节流195.2输入输出流5.2.3字节流阻塞式(Blocking)读写与非阻塞式(Blocking)读写方式常用字节流字节文件流:FileInputStream和FileOutputStream字节缓冲区流:BufferedInputStream和BufferedOutputStream数据字节流:DataInputStream和DataOutputStream205.2输入输出流5.2.3字节流205.2输入输出流5.2.3字节流:重写trans程序例5-4:能进行字节输入流读操作的source类例5-5:能进行字节输出流写操作的sink类例5-6:将字符转换为Unicode码的ChartoUnicode类例5-7:将Unicode码转换为字符的UnicodetoChar类对main()方法的改动215.2输入输出流5.2.3字节流:重写trans程序21【例5-4】能进行字节输入流读操作的source类,源代码如下://source.javaimportjava.io.*;classsource{privateBufferedInputStreambis;

publicsource(Stringfilename){//构造方法…//与例5-1中的构造方法内容完全一样}//从输入流中读入一行字符publicStringreadaline(){intc;//存放当前读入的字符Strings=newString();//保存已读入的字符行booleanreading=true;//控制是否继续读下一个字符

try{//异常结构,在本章的后面中介绍while(reading){//循环读下一个字符直到文件结束或行结束c=bis.read();//读取下一个字符放到c变量中if((c!=-1)&&(((char)c)!='\n')){//是否文件或行结束if(((char)c)!='\r')//删除可能多读取的换行符s+=(char)c;//将读取的字符加到已读取的字符最后}elsereading=false;//文件或行已结束}}catch(Exceptione){}//异常结构在本章的后面中介绍22【例5-4】能进行字节输入流读操作的source类,源代码如if(s.length()>0)//若所取的字符长度大于零return(s);//返回所读取的字符行elsereturnnull;//返回null表示没有读到字符}//关闭输入流publicvoidclose(){try{//异常结构,在本章的后面中介绍bis.close();//关闭输入流}catch(Exceptione){}}}23if(s.length()>0)//若所取的字符长【例5-5】能进行字节输入流读操作的sink类,源代码如下://sink.javaimportjava.io.*;classsink{privateBufferedOutputStreambos;publicsink(Stringfilename){//构造方法…//与例5-2中的构造方法内容完全一样}//向输出流中写入一行字符publicvoidwritealine(Strings){for(inti=0;i<s.length();i++){//每次循环写一个字符到输出流try{//异常结构,在本章的后面中介绍bos.write(s.charAt(i));//将一个字符写到输出流}catch(Exceptione){}}try{//异常结构,在本章的后面中介绍bos.write('\n');//写一个换行符}catch(Exceptione){}}publicvoidclose(){//关闭输出流try{//异常结构,在本章的后面中介绍bos.flush();//将缓冲区中的数据写到文件中bos.close();//关闭输出流}catch(Exceptione){}}}24【例5-5】能进行字节输入流读操作的sink类,源代码如下:【例5-6】将字符转换为Unicode码的ChartoUnicode类,源代码如下://ChartoUnicode.javaclassChartoUnicode{privateStringtheString;//保存待转换的字符串publicChartoUnicode(StringaString){//构造方法theString=aString;//初始化数据成员theString}publicStringconvert(){inti,j;//临时变量Stringchartodigit=newString();//保存转换后的Unicode码for(i=0;i<theString.length();i++){//每次循环转换一个字符j=(int)theString.charAt(i);//将一个字符转换成Unicode码chartodigit+=j+"";//将转换后的Unicode码保存起来}returnchartodigit;//返回转换后的Unicode码}}25【例5-6】将字符转换为Unicode码的ChartoUni【例5-7】将Unicode码转换为字符的UnicodetoChar类,源代码如下://UnicodetoChar.javaclassUnicodetoChar{privateStringtheString;//保存待转换的UnicodepublicUnicodetoChar(StringaString){//构造方法theString=aString;//初始化数据成员theString}publicStringconvert(){inti=0;//临时变量Strings=newString();//用于保存转换后的字符Stringthechar=newString();//当前将转换的Unicodewhile(i<theString.length()){//每次循环转换一个Unicode//获取下一个Unicode码

while((i<theString.length())&&(theString.charAt(i)!=''))thechar+=theString.charAt(i++);//将获取的Unicode码转换成字符并存入变量s中s+=(char)Integer.parseInt(thechar);thechar="";i++;}returns;//返回转换后的字符串}}26【例5-7】将Unicode码转换为字符的Unicodeto5.2输入输出流5.2.3字节流:重写trans程序的运行结果275.2输入输出流5.2.3字节流:重写trans程序的运5.2输入输出流5.2.4字符流从字符输入流中读数据intread();intread(charcbuf[]);intread(charcbuf[],intoffset,intlength);StringreadLine();向字符输出流中写数据intwrite(intc);intwrite(charcbuf[]);intwrite(charcbuf[],intoffset,intlength);285.2输入输出流5.2.4字符流285.2输入输出流5.2.4字符流:采用字符流重写trans程序例5-8:采用字符流重写的source类例5-9:采用字符流重写的sink类重新编译source.java和sink.java,其它类文件无需重编译,就能实现采用字符流进行读写的trans程序代码重用性295.2输入输出流5.2.4字符流:采用字符流重写tran5.3异常程序的正确性程序的完善性异常是关于程序的正确性与完善性的问题305.3异常程序的正确性305.3异常5.3.1异常的概念例5-10:求两个整数相除,除数为零的异常程序,源代码如下://Divide.javaimportjava.io.*;publicclassDivide{publicstaticvoidmain(String[]args){intnum1,num2,result;num1=Integer.valueOf(args[0]).intValue();num2=Integer.valueOf(args[1]).intValue();result=num1/num2;System.out.println(result);}}315.3异常5.3.1异常的概念315.3异常异常的分类:系统异常和用户自定义异常强制异常和非强制异常325.3异常异常的分类:325.3异常5.3.2异常的类层次强制捕获异常非强制捕获异常335.3异常5.3.2异常的类层次强制捕获异常非强制捕获异5.3异常5.3.2异常的类层次Exception类有两个构造方法:(1)publicException():用于构造一个不指明详细信息的异常。(2)publicException(Strings):用于构造一个由字符串参数s指明其详细信息的异常。Exception类还有两个方法在异常处理中也常用到,它们提供了对所发生异常的简单描述。这两个方法是:(1)StringgetMessage()(2)StringtoString()345.3异常5.3.2异常的类层次345.3异常5.3.3捕获及处理异常try{某些可能产生异常的语句}catch(异常类1e){对异常类1的处理语句}catch(异常类2e){对异常类2的处理语句}…catch(异常类ne){对异常类n的处理语句}finally{其它处理语句}355.3异常5.3.3捕获及处理异常355.3异常5.3.3捕获及处理异常【例5-11】try-catch-finally语句的执行顺序AExceptionEx.javapublicclassAExceptionEx{publicstaticvoidmain(Stringargs[]){int[]myArray=newint[10];intchoice;//将命令行的第一个参数(字符串形式)转换为整数choice=Integer.valueOf(args[0]).intValue();System.out.println("BeforeException.");try{if(choice==0)myArray[0]=10/choice;else{if(choice==1)myArray[10]=choice;365.3异常5.3.3捕获及处理异常365.3异常5.3.3捕获及处理异常【例5-11】try-catch-finally语句的执行顺序(续)elseSystem.out.println("没有发生异常.");}}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("下标越界异常:");System.out.println(e.toString());}catch(ArithmeticExceptione){System.out.println("算术运算异常:");System.out.println(e.toString());}finally{System.out.println("finally总会被执行.");}System.out.println("try-catch-finally语句后的语句.");}}375.3异常5.3.3捕获及处理异常375.3异常5.3.3捕获及处理异常异常的传递:如果在一个方法中发生了异常,而方法中又没有对该异常进行捕获和处理。则该异常会被传送到调用该方法的类来进行处理。385.3异常5.3.3捕获及处理异常385.3异常5.3.3捕获及处理异常【例5-12】异常的传递://SubExceptionEx.javapublicclassSubExceptionEx{publicstaticvoidmain(Stringargs[]){intchoice;//将命令行的第一个参数(字符串形式)转换为整数choice=Integer.valueOf(args[0]).intValue();try{method(choice);}catch(Exceptione){System.out.println(e.toString());}}staticvoidmethod(intchoice){int[]myArray=newint[10];myArray[0]=10/choice;}}395.3异常5.3.3捕获及处理异常395.3异常5.3.3捕获及处理异常在source类中加入异常处理:例5-13在sink类中加入异常处理:例5-14405.3异常5.3.3捕获及处理异常405.3异常5.3.4自定义异常【例5-15】用户自定义异常://FormatException.javaclassFormatExceptionextendsException{privateStringErrorMessage;publicFormatException(Stringmessage){super(message);//调用父类的构造方法ErrorMessage=message;}publicStringgetMessage(){//重写父类的getMessage()方法return“输入的字符串:”+ErrorMessage+“包含非数字字符。”;}}415.3异常5.3.4自定义异常415.3异常5.3.5声明异常和抛出异常throw语句用于抛出一个异常,其语句格式如下:throw异常对象;在一个方法中,如果要抛出用户异常,则在该方法的头部必须用throws关键字指明用户异常类的类名。如下所示:publicstaticvoidmain(String[]args)throwsFormatException表示在main方法中可以抛出类名为FormatException用户异常。425.3异常5.3.5声明异常和抛出异常425.4问题的实现最后的trans程序包含了以下六个类:(1)trans:trans类是整个程序的主类,其中的main方法主要用于读取命令行的参数。根据不同的参数,调用不同的方法来实现程序的功能。(2)source:source类实现了输入流的功能。其私有成员br用于表示带缓冲区的字符输入流。source的构造方法接收一个字符串参数。用此参数作文件名构造一个带缓冲区的字符输入流并赋值给成员变量br。source类的readaline()方法用于从输入流中读入一行字符,返回值为读入的一行字符。close()方法关闭输入流。435.4问题的实现最后的trans程序包含了以下六个类:435.4问题的实现(3)sink:sink类实现了输出流的功能。其私有成员bw用于表示带缓冲区的字符输出流。sink类的构造方法接收一个字符串参数。用此参数作文件名构造一个带缓冲区的字符输出流并赋值给成员变量bw。sink类的writealine(Strings)方法用于向输出流中写出一行字符,它接受一个字符串变量,并将字符串的内容作为一行字符写出到输出流中。close()方法关闭输出流。(4)UnicodetoChar:UnicodetoChar类用于实现从Unicode编码转换成字符。它有一个私有成员theString为字符串。其构造方法对私有成员变量赋初值。方法convert将私有成员theString中的Unicode编码转换成字符串。返回值就是经转换后的字符串。445.4问题的实现(3)sink:sink类实现了输出流的功5.4问题的实现(5)ChartoUnicode:CharToUnicode类的功能正好与UnicodetoChar类相反。它将一行字符串转换成以分空格分开的Unicode编码。(6)FormatException:FormatException类是一个异常类。当要将输入文件中的Unicode编码转换成字符,而输入文件中包含非十进制数字时,程序将抛出该异常。455.4问题的实现(5)ChartoUnicode:Char本章小结本章介绍了输入输出流和异常的基础知识。本章从引入一个字符和Unicode编码转换的例子,逐步介绍了Java中流类的层次,字节输入输出流,字符输入输出流,对象序列化的概念。然后介绍了异常的概念,异常的处理机制。最后通过所学的知识,实现了在第一节提出的字符和Unicode编码相互转换的程序。46本章小结本章介绍了输入输出流和异常的基础知识。本章从引入一个第5章输入输出流和异常47第5章输入输出流和异常1本章主要内容问题的提出与分析流的概念字节流的分类及其常用方法字符流的分类及其常用方法异常的概念Java的异常处理机制用户异常的定义和实现48本章主要内容问题的提出与分析25.1问题的提出与分析问题的提出ASCII编码Unicode编码Unicode编码与字符之间的转换495.1问题的提出与分析问题的提出3第5章-输入输出流和异常-面向对象程序设计-Java-教学课件第5章-输入输出流和异常-面向对象程序设计-Java-教学课件5.1问题的提出与分析用UML图描述的类之间的关系525.1问题的提出与分析用UML图描述的类之间的关系65.1问题的提出与分析最终程序的运行界面535.1问题的提出与分析最终程序的运行界面75.2输入输出流5.2.1流的概念将输入输出过程抽象为数据流数据源,数据宿特性:顺序性:先从数据源流出的数据一定比后流出的数据先到达数据宿单向性:数据只能从数据源流向数据宿唯一性:数据流必须而且只能和一个数据源与一个数据宿相连545.2输入输出流5.2.1流的概念85.2输入输出流5.2.2输入输出流类层次InputStreamStringBufferInputStreamSequenceInputStreamByteArrayInputStreamFilterInputStreamPipedInputStreamFileInputStreamProgressMonitorInputStreamInflateInputStreamDigestInputStreamCipherInputStreamCheckedInputStreamPushbackInputStreamBufferedInputStreamDataInputStreamLineNumberInputStream字节输入流类的层次关系555.2输入输出流5.2.2输入输出流类层次InputSt5.2输入输出流5.2.2输入输出流类层次字节输出流类的层次关系OutputStreamByteArrayOutputStreamFilterOutputStreamPipedOutputStreamFileOutputStreamPrintStreamBufferedOutputStreamDataOutputStream565.2输入输出流5.2.2输入输出流类层次字节输出流类的5.2输入输出流5.2.2输入输出流类层次字符输入流类的层次关系PushbackReaderFineReaderLineNumberReaderReaderStringReaderFilterReaderCharArrayReaderBufferedReaderInputStreamReaderPipedReader575.2输入输出流5.2.2输入输出流类层次字符输入流类的5.2输入输出流5.2.2输入输出流类层次字符输出流类的层次关系FineWriterWriterStringWriterFilterWriterCharArrayWriterBufferedWriterOutputStreamWriterPipedWriterPrintWriter585.2输入输出流5.2.2输入输出流类层次字符输出流类的5.2输入输出流例5-1,一个封装了缓冲输入流的类:sourceimportjava.io.*;classsource{privateBufferedInputStreambis;publicsource(Stringfilename){//构造方法//判断是否从键盘读if(filename.toLowerCase().compareTo("stdin")==0)bis=newBufferedInputStream(System.in);//建立缓冲区键盘输入流对象else{try{//异常结构,在本章的后面中介绍//建立缓冲区文件输入流对象bis=newBufferedInputStream(newFileInputStream(filename));}catch(Exceptione){}//异常结构在本章的后面中介绍}}publicStringreadaline(){//从输入流中读入一行字符return(null);//此处为预留功能,后面将添加具体实现}publicvoidclose(){}//关闭输入流}595.2输入输出流例5-1,一个封装了缓冲输入流的类:sou5.2输入输出流例5-2,一个封装了缓冲输出流的类:sinkimportjava.io.*;classsink{privateBufferedOutputStreambos;publicsink(Stringfilename){//构造方法//判断是否向屏幕写if(filename.toLowerCase().compareTo("stdout")==0)bos=newBufferedOutputStream(System.out);//建立缓冲区屏幕输出流对象else{try{//异常结构在本章的后面中介绍//建立缓冲区文件输出流对象bos=newBufferedOutputStream(newFileOutputStream(filename));}catch(Exceptione){}//异常结构在本章的后面中介绍}}publicvoidwritealine(Strings){}//向输出流中写入一行字符publicvoidclose(){}//关闭输出流}605.2输入输出流例5-2,一个封装了缓冲输出流的类:sin5.2输入输出流例5-3,trans程序的的main方法:publicclasstrans{publicstaticvoidmain(String[]args){//检查是否输入了三个参数,并且第三个参数只是一个字符if((args.length!=3)||(args[2].length()!=1)){printInfo();//输出本程序的使用方法System.exit(0);//结束运行}chartransmode;//用于保存命令行的第三个参数,即进行何种种转换transmode=args[2].charAt(0);//从命令行获取第三个参数//根据第三个参数值用不同的参数调用doTrans方法实现代编码转换switch(transmode){case'U':case'u'://将Unicode码转换成字符;System.out.println("实现Unicode码转换成字符的工作尚未完成");doTrans(args[0],args[1],1);//调用doTrans方法将Unicode码转换成字符;break;615.2输入输出流例5-3,trans程序的的main方法:5.2输入输出流例5-3,trans程序的的main方法(续):case'C':case'c'://将字符转换成Unicode码System.out.println("实现字符转换成Unicode码的工作尚未完成");doTrans(args[0],args[1],2);//调用doTrans方法将字符转换成Unicode码;break;case'N':case'n'://不进行转换System.out.println("实现文件复制的工作尚未完成");doTrans(args[0],args[1],0);//调用doTrans方法实现文件复制;break;default:printInfo();//输出本程序的使用方法System.exit(0);//结束运行}}625.2输入输出流例5-3,trans程序的的main方法(5.2输入输出流例5-3,trans程序的的main方法(续):staticvoiddoTrans(Stringinfile,Stringoutfile,intflag){Stringlinein,lineout="";sourcesin=newsource(infile);//根据第一个参数构造一个输入流类sinksout=newsink(outfile);//根据第二个参数构造一个输出流类linein=sin.readaline();//读入一行字符到linein中while(linein!=null){//如果linein不为空,则对其进行处理if(flag==1){//将Unicode码转换成字符的程序将在后面实现;}elseif(flag==2){//将字符转换成Unicode码的程序将在后面实现;}elseif(flag==0){//实现文件复制的程序将在后面实现;}sout.writealine(lineout);//将lineout写出到输出流中linein=sin.readaline();//读入下一行字符到linein中}sin.close();//关闭输入流sout.close();//关闭输出流}635.2输入输出流例5-3,trans程序的的main方法(5.2输入输出流例5-3,trans程序的的main方法(续):staticvoidprintInfo(){System.out.println("正确的格式是:javatrans<数据源><数据宿><转换方式>");System.out.println("数据源可以是stdin代表键盘,或者文件名");System.out.println("数据源可以是stdout代表屏幕,或者文件名");System.out.println("转换方式可以U,代表将Unicode码转换成字符;或者C,代表将字符转换成Unicode码;或者N表示不进行换");}}645.2输入输出流例5-3,trans程序的的main方法(5.2输入输出流5.2.3字节流从字节输入流中读数据intread();intread(byte[]buffer);intread(byte[]buffer,intoffset,intlength);向字节输出流中写数据voidwrite(intb);voidwrite(byte[]buffer);voidwrite(byte[]buffer,intoffset,intlength);655.2输入输出流5.2.3字节流195.2输入输出流5.2.3字节流阻塞式(Blocking)读写与非阻塞式(Blocking)读写方式常用字节流字节文件流:FileInputStream和FileOutputStream字节缓冲区流:BufferedInputStream和BufferedOutputStream数据字节流:DataInputStream和DataOutputStream665.2输入输出流5.2.3字节流205.2输入输出流5.2.3字节流:重写trans程序例5-4:能进行字节输入流读操作的source类例5-5:能进行字节输出流写操作的sink类例5-6:将字符转换为Unicode码的ChartoUnicode类例5-7:将Unicode码转换为字符的UnicodetoChar类对main()方法的改动675.2输入输出流5.2.3字节流:重写trans程序21【例5-4】能进行字节输入流读操作的source类,源代码如下://source.javaimportjava.io.*;classsource{privateBufferedInputStreambis;

publicsource(Stringfilename){//构造方法…//与例5-1中的构造方法内容完全一样}//从输入流中读入一行字符publicStringreadaline(){intc;//存放当前读入的字符Strings=newString();//保存已读入的字符行booleanreading=true;//控制是否继续读下一个字符

try{//异常结构,在本章的后面中介绍while(reading){//循环读下一个字符直到文件结束或行结束c=bis.read();//读取下一个字符放到c变量中if((c!=-1)&&(((char)c)!='\n')){//是否文件或行结束if(((char)c)!='\r')//删除可能多读取的换行符s+=(char)c;//将读取的字符加到已读取的字符最后}elsereading=false;//文件或行已结束}}catch(Exceptione){}//异常结构在本章的后面中介绍68【例5-4】能进行字节输入流读操作的source类,源代码如if(s.length()>0)//若所取的字符长度大于零return(s);//返回所读取的字符行elsereturnnull;//返回null表示没有读到字符}//关闭输入流publicvoidclose(){try{//异常结构,在本章的后面中介绍bis.close();//关闭输入流}catch(Exceptione){}}}69if(s.length()>0)//若所取的字符长【例5-5】能进行字节输入流读操作的sink类,源代码如下://sink.javaimportjava.io.*;classsink{privateBufferedOutputStreambos;publicsink(Stringfilename){//构造方法…//与例5-2中的构造方法内容完全一样}//向输出流中写入一行字符publicvoidwritealine(Strings){for(inti=0;i<s.length();i++){//每次循环写一个字符到输出流try{//异常结构,在本章的后面中介绍bos.write(s.charAt(i));//将一个字符写到输出流}catch(Exceptione){}}try{//异常结构,在本章的后面中介绍bos.write('\n');//写一个换行符}catch(Exceptione){}}publicvoidclose(){//关闭输出流try{//异常结构,在本章的后面中介绍bos.flush();//将缓冲区中的数据写到文件中bos.close();//关闭输出流}catch(Exceptione){}}}70【例5-5】能进行字节输入流读操作的sink类,源代码如下:【例5-6】将字符转换为Unicode码的ChartoUnicode类,源代码如下://ChartoUnicode.javaclassChartoUnicode{privateStringtheString;//保存待转换的字符串publicChartoUnicode(StringaString){//构造方法theString=aString;//初始化数据成员theString}publicStringconvert(){inti,j;//临时变量Stringchartodigit=newString();//保存转换后的Unicode码for(i=0;i<theString.length();i++){//每次循环转换一个字符j=(int)theString.charAt(i);//将一个字符转换成Unicode码chartodigit+=j+"";//将转换后的Unicode码保存起来}returnchartodigit;//返回转换后的Unicode码}}71【例5-6】将字符转换为Unicode码的ChartoUni【例5-7】将Unicode码转换为字符的UnicodetoChar类,源代码如下://UnicodetoChar.javaclassUnicodetoChar{privateStringtheString;//保存待转换的UnicodepublicUnicodetoChar(StringaString){//构造方法theString=aString;//初始化数据成员theString}publicStringconvert(){inti=0;//临时变量Strings=newString();//用于保存转换后的字符Stringthechar=newString();//当前将转换的Unicodewhile(i<theString.length()){//每次循环转换一个Unicode//获取下一个Unicode码

while((i<theString.length())&&(theString.charAt(i)!=''))thechar+=theString.charAt(i++);//将获取的Unicode码转换成字符并存入变量s中s+=(char)Integer.parseInt(thechar);thechar="";i++;}returns;//返回转换后的字符串}}72【例5-7】将Unicode码转换为字符的Unicodeto5.2输入输出流5.2.3字节流:重写trans程序的运行结果735.2输入输出流5.2.3字节流:重写trans程序的运5.2输入输出流5.2.4字符流从字符输入流中读数据intread();intread(charcbuf[]);intread(charcbuf[],intoffset,intlength);StringreadLine();向字符输出流中写数据intwrite(intc);intwrite(charcbuf[]);intwrite(charcbuf[],intoffset,intlength);745.2输入输出流5.2.4字符流285.2输入输出流5.2.4字符流:采用字符流重写trans程序例5-8:采用字符流重写的source类例5-9:采用字符流重写的sink类重新编译source.java和sink.java,其它类文件无需重编译,就能实现采用字符流进行读写的trans程序代码重用性755.2输入输出流5.2.4字符流:采用字符流重写tran5.3异常程序的正确性程序的完善性异常是关于程序的正确性与完善性的问题765.3异常程序的正确性305.3异常5.3.1异常的概念例5-10:求两个整数相除,除数为零的异常程序,源代码如下://Divide.javaimportjava.io.*;publicclassDivide{publicstaticvoidmain(String[]args){intnum1,num2,result;num1=Integer.valueOf(args[0]).intValue();num2=Integer.valueOf(args[1]).intValue();result=num1/num2;System.out.println(result);}}775.3异常5.3.1异常的概念315.3异常异常的分类:系统异常和用户自定义异常强制异常和非强制异常785.3异常异常的分类:325.3异常5.3.2异常的类层次强制捕获异常非强制捕获异常795.3异常5.3.2异常的类层次强制捕获异常非强制捕获异5.3异常5.3.2异常的类层次Exception类有两个构造方法:(1)publicException():用于构造一个不指明详细信息的异常。(2)publicException(Strings):用于构造一个由字符串参数s指明其详细信息的异常。Exception类还有两个方法在异常处理中也常用到,它们提供了对所发生异常的简单描述。这两个方法是:(1)StringgetMessage()(2)StringtoString()805.3异常5.3.2异常的类层次345.3异常5.3.3捕获及处理异常try{某些可能产生异常的语句}catch(异常类1e){对异常类1的处理语句}catch(异常类2e){对异常类2的处理语句}…catch(异常类ne){对异常类n的处理语句}finally{其它处理语句}815.3异常5.3.3捕获及处理异常355.3异常5.3.3捕获及处理异常【例5-11】try-catch-finally语句的执行顺序AExceptionEx.javapublicclassAExceptionEx{publicstaticvoidmain(Stringargs[]){int[]myArray=newint[10];intchoice;//将命令行的第一个参数(字符串形式)转换为整数choice=Integer.valueOf(args[0]).intValue();System.out.println("BeforeException.");try{if(choice==0)myArray[0]=10/choice;else{if(choice==1)myArray[10]=choice;825.3异常5.3.3捕获及处理异常365.3异常5.3.3捕获及处理异常【例5-11】try-catch-finally语句的执行顺序(续)elseSystem.out.println("没有发生异常.");}}catch(ArrayIndexOutOfB

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论