1、12 问题的提出与分析 流的概念 字节流的分类及其常用方法 字符流的分类及其常用方法 异常的概念 Java的异常处理机制 用户异常的定义和实现3 问题的提出ASCII编码Unicode编码Unicode编码与字符之间的转换6 用UML图描述的类之间的关系7 最终程序的运行界面8 5.2.1 流的概念将输入输出过程抽象为数据流数据源,数据宿特性:顺序性:先从数据源流出的数据一定比后流出的数据先到达数据宿 单向性:数据只能从数据源流向数据宿 唯一性:数据流必须而且只能和一个数据源与一个数据宿相连 9 5.2.2 输入输出流类层次InputStreamInputStreamStringBufferI
2、nputStreamStringBufferInputStreamSequenceInputStreamSequenceInputStreamByteArrayInputStreamByteArrayInputStreamFilterInputStreamFilterInputStreamPipedInputStreamPipedInputStreamFileInputStreamFileInputStreamProgressMonitorInputStreamProgressMonitorInputStreamInflateInputStreamInflateInputStreamDiges
3、tInputStreamDigestInputStreamCipherInputStreamCipherInputStreamCheckedInputStreamCheckedInputStreamPushbackInputStreamPushbackInputStreamBufferedInputStreamBufferedInputStreamDataInputStreamDataInputStreamLineNumberInputStreamLineNumberInputStream字节输入流类的层次关系字节输入流类的层次关系10 5.2.2 输入输出流类层次字节输出流类的层次关系字节输
4、出流类的层次关系OutputStreamOutputStreamByteArrayOutputStreamByteArrayOutputStreamFilterOutputStreamFilterOutputStreamPipedOutputStreamPipedOutputStreamFileOutputStreamFileOutputStreamPrintStreamPrintStreamBufferedOutputStreamBufferedOutputStreamDataOutputStreamDataOutputStream11 5.2.2 输入输出流类层次字符输入流类的层次关系字符
5、输入流类的层次关系PushbackReaderPushbackReaderFineReaderFineReaderLineNumberReaderLineNumberReaderReaderReaderStringReaderStringReaderFilterReaderFilterReaderCharArrayReaderCharArrayReaderBufferedReaderBufferedReaderInputStreamReaderInputStreamReaderPipedReaderPipedReader12 5.2.2 输入输出流类层次字符输出流类的层次关系字符输出流类的层次
6、关系FineWriterFineWriterWriterWriterStringWriterStringWriterFilterWriterFilterWriterCharArrayWriterCharArrayWriterBufferedWriterBufferedWriterOutputStreamWriterOutputStreamWriterPipedWriterPipedWriterPrintWriterPrintWriter13例例5-1,一个封装了缓冲输入流的类:一个封装了缓冲输入流的类:sourceimport java.io.*;class source private Bu
7、fferedInputStream bis;public source(String filename)/构造方法构造方法 /判断是否从键盘读判断是否从键盘读 if(filename.toLowerCase().compareTo(stdin)=0)bis=new BufferedInputStream(System.in);/建立缓冲区键建立缓冲区键盘输入流对象盘输入流对象 else try /异常结构,在本章的后面中介绍异常结构,在本章的后面中介绍 /建立缓冲区文件输入流对象建立缓冲区文件输入流对象 bis=new BufferedInputStream(new FileInputStre
8、am(filename);catch(Exception e)/异常结构在本章的后面中介绍异常结构在本章的后面中介绍 public String readaline()/从输入流中读入一行字符从输入流中读入一行字符 return(null);/此处为预留功能,后面将添加具体实现此处为预留功能,后面将添加具体实现 public void close()/关闭输入流关闭输入流14例例5-2,一个封装了缓冲输出流的类:一个封装了缓冲输出流的类:sinkimport java.io.*;class sink private BufferedOutputStream bos;public sink(St
9、ring filename)/构造方法构造方法 /判断是否向屏幕写判断是否向屏幕写 if(filename.toLowerCase().compareTo(stdout)=0)bos=new BufferedOutputStream(System.out);/建立缓冲建立缓冲区屏幕输出流对象区屏幕输出流对象 else try/异常结构在本章的后面中介绍异常结构在本章的后面中介绍 /建立缓冲区文件输出流对象建立缓冲区文件输出流对象 bos=new BufferedOutputStream(new FileOutputStream(filename);catch(Exception e)/异常结构
10、在本章的后面中介绍异常结构在本章的后面中介绍 public void writealine(String s)/向输出流中写入一行字符向输出流中写入一行字符 public void close()/关闭输出流关闭输出流15例例5-3,trans程序的的程序的的main方法:方法:public class trans public static void main(String args)/检查是否输入了三个参数,并且第三个参数只是一个字符检查是否输入了三个参数,并且第三个参数只是一个字符 if(args.length!=3)|(args2.length()!=1)printInfo();/输出
11、本程序的使用方法输出本程序的使用方法 System.exit(0);/结束运行结束运行 char transmode;/用于保存命令行的第三个参数,即进行何种种转换用于保存命令行的第三个参数,即进行何种种转换 transmode=args2.charAt(0);/从命令行获取第三个参数从命令行获取第三个参数 /根据第三个参数值用不同的参数调用根据第三个参数值用不同的参数调用doTrans方法实现代编码转换方法实现代编码转换 switch(transmode)case U:case u:/将将Unicode码转换成字符码转换成字符;System.out.println(实现实现Unicode码转
12、换成字符的工作尚未完成码转换成字符的工作尚未完成);doTrans(args0,args1,1);/调用调用doTrans方法将方法将Unicode码转换成字码转换成字符符;break;16例例5-3,trans程序的的程序的的main方法(续):方法(续):case C:case c:/将字符转换成将字符转换成Unicode码码 System.out.println(实现字符转换成实现字符转换成Unicode码的工作尚未完成码的工作尚未完成);doTrans(args0,args1,2);/调用调用doTrans方法将字符转换成方法将字符转换成Unicode码码;break;case N:c
13、ase n:/不进行转换不进行转换 System.out.println(实现文件复制的工作尚未完成实现文件复制的工作尚未完成);doTrans(args0,args1,0);/调用调用doTrans方法实现文件复制方法实现文件复制;break;default:printInfo();/输出本程序的使用方法输出本程序的使用方法 System.exit(0);/结束运行结束运行 17例例5-3,trans程序的的程序的的main方法(续):方法(续):static void doTrans(String infile,String outfile,int flag)String linein,l
14、ineout=;source sin=new source(infile);/根据第一个参数构造一个输入流类根据第一个参数构造一个输入流类 sink sout=new sink(outfile);/根据第二个参数构造一个输出流类根据第二个参数构造一个输出流类 linein=sin.readaline();/读入一行字符到读入一行字符到linein中中 while(linein!=null)/如果如果linein不为空不为空,则对其进行处理则对其进行处理 if(flag=1)/将将Unicode码转换成字符的程序将在后面实现码转换成字符的程序将在后面实现;else if(flag=2)/将字符转
15、换成将字符转换成Unicode码的程序将在后面实现码的程序将在后面实现;else if(flag=0)/实现文件复制的程序将在后面实现实现文件复制的程序将在后面实现;sout.writealine(lineout);/将将lineout写出到输出流中写出到输出流中 linein=sin.readaline();/读入下一行字符到读入下一行字符到linein中中 sin.close();/关闭输入流关闭输入流 sout.close();/关闭输出流关闭输出流 18例例5-3,trans程序的的程序的的main方法(续):方法(续):static void printInfo()System.ou
16、t.println(正确的格式是正确的格式是:java trans );System.out.println(数据源可以是数据源可以是stdin代表键盘,或者文件代表键盘,或者文件名名);System.out.println(数据源可以是数据源可以是stdout代表屏幕,或者文代表屏幕,或者文件名件名);System.out.println(转换方式可以转换方式可以U,代表将,代表将Unicode码转码转换成字符;换成字符;或者或者C,代表将字符转换成,代表将字符转换成Unicode码;或者码;或者N表示表示不进行换不进行换);19 5.2.3 字节流从字节输入流中读数据 int read()
17、;int read(byte buffer);int read(byte buffer,int offset,int length);向字节输出流中写数据 void write(int b);void write(byte buffer);void write(byte buffer,int offset,int length);20 5.2.3 字节流阻塞式(Blocking)读写与非阻塞式(Blocking)读写方式常用字节流 字节文件流:FileInputStream和FileOutputStream 字节缓冲区流:BufferedInputStream和BufferedOutputSt
18、ream 数据字节流:DataInputStream和DataOutputStream21 5.2.3 字节流:重写trans程序例5-4:能进行字节输入流读操作的source类例5-5:能进行字节输出流写操作的sink类例5-6:将字符转换为Unicode码的ChartoUnicode类例5-7:将Unicode码转换为字符的UnicodetoChar类对main()方法的改动22【例例5-4】能进行字节输入流读操作的source类,源代码如下:/source.javaimport java.io.*;class source private BufferedInputStream bis;
19、public source(String filename)/构造方法 /与例5-1中的构造方法内容完全一样 /从输入流中读入一行字符 public String readaline()int c;/存放当前读入的字符String s=new String();/保存已读入的字符行 boolean reading=true;/控制是否继续读下一个字符 try /异常结构,在本章的后面中介绍 while(reading)/循环读下一个字符直到文件结束或行结束 c=bis.read();/读取下一个字符放到c变量中 if(c!=-1)&(char)c)!=n)/是否文件或行结束 if(char)c
20、)!=r)/删除可能多读取的换行符 s+=(char)c;/将读取的字符加到已读取的字符最后 else reading=false;/文件或行已结束 catch(Exception e)/异常结构在本章的后面中介绍23if(s.length()0)/若所取的字符长度大于零 return(s);/返回所读取的字符行 else return null;/返回null表示没有读到字符 /关闭输入流 public void close()try /异常结构,在本章的后面中介绍 bis.close();/关闭输入流 catch(Exception e)24【例例5-5】能进行字节输入流读操作的sink类
21、,源代码如下:/sink.javaimport java.io.*;class sink private BufferedOutputStream bos;public sink(String filename)/构造方法/与例5-2中的构造方法内容完全一样 /向输出流中写入一行字符 public void writealine(String s)for(int i=0;i s.length();i+)/每次循环写一个字符到输出流 try /异常结构,在本章的后面中介绍 bos.write(s.charAt(i);/将一个字符写到输出流 catch(Exception e)try /异常结构,
22、在本章的后面中介绍 bos.write(n);/写一个换行符 catch(Exception e)public void close()/关闭输出流 try /异常结构,在本章的后面中介绍 bos.flush();/将缓冲区中的数据写到文件中 bos.close();/关闭输出流 catch(Exception e)25【例例5-6】将字符转换为Unicode码的ChartoUnicode类,源代码如下:/ChartoUnicode.javaclass ChartoUnicode private String theString;/保存待转换的字符串 public ChartoUnicode(
23、String aString)/构造方法 theString=aString;/初始化数据成员theStringpublic String convert()int i,j;/临时变量 String chartodigit=new String();/保存转换后的Unicode码 for(i=0;itheString.length();i+)/每次循环转换一个字符 j=(int)theString.charAt(i);/将一个字符转换成Unicode码 chartodigit+=j+;/将转换后的Unicode码保存起来 return chartodigit;/返回转换后的Unicode码 2
24、6【例例5-7】将Unicode码转换为字符的UnicodetoChar类,源代码如下:/UnicodetoChar.javaclass UnicodetoChar private String theString;/保存待转换的Unicode public UnicodetoChar(String aString)/构造方法 theString=aString;/初始化数据成员theString public String convert()int i=0;/临时变量 String s=new String();/用于保存转换后的字符 String thechar=new String();
25、/当前将转换的Unicode while(i theString.length()/每次循环转换一个Unicode /获取下一个Unicode码 while(itheString.length()&(theString.charAt(i)!=)thechar+=theString.charAt(i+);/将获取的Unicode码转换成字符并存入变量s中 s+=(char)Integer.parseInt(thechar);thechar=;i+;return s;/返回转换后的字符串 27 5.2.3 字节流:重写trans程序的运行结果28 5.2.4 字符流从字符输入流中读数据 int r
26、ead();int read(char cbuf);int read(char cbuf,int offset,int length);String readLine();向字符输出流中写数据 int write(int c);int write(char cbuf);int write(char cbuf,int offset,int length);29 5.2.4 字符流:采用字符流重写trans程序例5-8:采用字符流重写的source类例5-9:采用字符流重写的sink类重新编译source.java和sink.java,其它类文件无需重编译,就能实现采用字符流进行读写的trans程
27、序代码重用性30 程序的正确性 程序的完善性 异常是关于程序的正确性与完善性的问题31 5.3.1 异常的概念例5-10:求两个整数相除,除数为零的异常程序,源代码如下:/Divide.javaimport java.io.*;public class Divide public static void main(String args)int num1,num2,result;num1=Integer.valueOf(args0).intValue();num2=Integer.valueOf(args1).intValue();result=num1/num2;System.out.pri
28、ntln(result);32异常的分类:系统异常和用户自定义异常 强制异常和非强制异常33 5.3.2 异常的类层次强制捕获异常非强制捕获异常34 5.3.2 异常的类层次Exception类有两个构造方法:(1)public Exception():用于构造一个不指明详细信息的异常。(2)public Exception(String s):用于构造一个由字符串参数s指明其详细信息的异常。Exception类还有两个方法在异常处理中也常用到,它们提供了对所发生异常的简单描述。这两个方法是:(1)String getMessage()(2)String toString()35 5.3.3
29、捕获及处理异常try 某些可能产生异常的语句某些可能产生异常的语句catch(异常类异常类1 e)对异常类对异常类1的处理语句的处理语句catch(异常类异常类2 e)对异常类对异常类2的处理语句的处理语句catch(异常类异常类n e)对异常类对异常类n的处理语句的处理语句finally 其它处理语句其它处理语句36 5.3.3 捕获及处理异常【例【例5-11】try-catch-finally语句的执行顺序语句的执行顺序AExceptionEx.javapublic class AExceptionEx public static void main(String args)int myA
30、rray=new int10;int choice;/将命令行的第一个参数(字符串形式)转换为整数将命令行的第一个参数(字符串形式)转换为整数 choice=Integer.valueOf(args0).intValue();System.out.println(Before Exception.);try if(choice=0)myArray0=10/choice;else if(choice=1)myArray10=choice;37 5.3.3 捕获及处理异常【例【例5-11】try-catch-finally语句的执行顺序语句的执行顺序(续续)else System.out.prin
31、tln(没有发生异常没有发生异常.);catch(ArrayIndexOutOfBoundsException e)System.out.println(下标越界异常下标越界异常:);System.out.println(e.toString();catch(ArithmeticException e)System.out.println(算术运算异常算术运算异常:);System.out.println(e.toString();finally System.out.println(finally总会被执行总会被执行.);System.out.println(try-catch-finall
32、y语句后的语句语句后的语句.);385.3.3 捕获及处理异常异常的传递:异常的传递:如果在一个方法中发生了异常,而方法中又没如果在一个方法中发生了异常,而方法中又没有对该异常进行捕获和处理。则该异常会被传有对该异常进行捕获和处理。则该异常会被传送到调用该方法的类来进行处理。送到调用该方法的类来进行处理。39 5.3.3 捕获及处理异常【例【例5-12】异常的传递:】异常的传递:/SubExceptionEx.javapublic class SubExceptionEx public static void main(String args)int choice;/将命令行的第一个参数(字符
33、串形式)转换为整数将命令行的第一个参数(字符串形式)转换为整数 choice=Integer.valueOf(args0).intValue();try method(choice);catch(Exception e)System.out.println(e.toString();static void method(int choice)int myArray=new int10;myArray0=10/choice;40 5.3.3 捕获及处理异常 在在source类中加入异常处理:例类中加入异常处理:例5-13 在在sink类中加入异常处理:例类中加入异常处理:例5-1441 5.3.
34、4 自定义异常【例5-15】用户自定义异常:/FormatException.javaclass FormatException extends Exception private String ErrorMessage;public FormatException(String message)super(message);/调用父类的构造方法 ErrorMessage=message;public String getMessage()/重写父类的getMessage()方法 return“输入的字符串:”+ErrorMessage+“包含非数字字符。”;425.3.5声明异常和抛出异常t
35、hrow语句用于抛出一个异常,其语句格式如下:throw 异常对象;异常对象;在一个方法中,如果要抛出用户异常,则在该方法的头部必须用throws关键字指明用户异常类的类名。如下所示:public static void main(String args)throws FormatException表示在main方法中可以抛出类名为FormatException用户异常。43最后的trans程序包含了以下六个类:(1)trans:trans类是整个程序的主类,其中的main方法主要用于读取命令行的参数。根据不同的参数,调用不同的方法来实现程序的功能。(2)source:source类实现了输入
36、流的功能。其私有成员br用于表示带缓冲区的字符输入流。source的构造方法接收一个字符串参数。用此参数作文件名构造一个带缓冲区的字符输入流并赋值给成员变量br。source类的readaline()方法用于从输入流中读入一行字符,返回值为读入的一行字符。close()方法关闭输入流。44(3)sink:sink类实现了输出流的功能。其私有成员bw用于表示带缓冲区的字符输出流。sink类的构造方法接收一个字符串参数。用此参数作文件名构造一个带缓冲区的字符输出流并赋值给成员变量bw。sink类的writealine(String s)方法用于向输出流中写出一行字符,它接受一个字符串变量,并将字符
37、串的内容作为一行字符写出到输出流中。close()方法关闭输出流。(4)UnicodetoChar:UnicodetoChar类用于实现从Unicode编码转换成字符。它有一个私有成员theString为字符串。其构造方法对私有成员变量赋初值。方法convert将私有成员theString中的Unicode编码转换成字符串。返回值就是经转换后的字符串。45(5)ChartoUnicode:CharToUnicode类的功能正好与UnicodetoChar类相反。它将一行字符串转换成以分空格分开的Unicode编码。(6)FormatException:FormatException类是一个异常类。当要将输入文件中的Unicode编码转换成字符,而输入文件中包含非十进制数字时,程序将抛出该异常。46本章介绍了输入输出流和异常的基础知识。本章从引入一个字符和Unicode编码转换的例子,逐步介绍了Java中流类的层次,字节输入输出流,字符输入输出流,对象序列化的概念。然后介绍了异常的概念,异常的处理机制。最后通过所学的知识,实现了在第一节提出的字符和Unicode编码相互转换的程序。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。