
第9章Java高级编程ppt课件.ppt
37页学习导读学习导读 本章将引见本章将引见Java言语中的一些高级特性:言语中的一些高级特性:异常处置、多线程机制、流式异常处置、多线程机制、流式IO以及网络通讯,以及网络通讯,其中每个部分都能扩展成一个专题读者在本其中每个部分都能扩展成一个专题读者在本章学习到的只是其中很小的一部分,但是可以章学习到的只是其中很小的一部分,但是可以从中了解一些根本概念和根本操作,为今后的从中了解一些根本概念和根本操作,为今后的深化学习打下根底异常处置提供对错误的捕深化学习打下根底异常处置提供对错误的捕捉和处置机制;多线程机制使得程序的多个子捉和处置机制;多线程机制使得程序的多个子义务可以义务可以“同时同时〞〞执行;流式执行;流式IO提供了对输入提供了对输入输出的读写机制;网络通讯特性允许输出的读写机制;网络通讯特性允许Java程序程序经过经过Socket实现底层通讯,并利用实现底层通讯,并利用Java提供提供的扩展组件实现高层效力的扩展组件实现高层效力第九章 Java高级编程 教学重点与难点:教学重点与难点:v异常处置、多线程机制、流式异常处置、多线程机制、流式IO以及网络通以及网络通讯的根本概念和模型讯的根本概念和模型v异常的捕获和处置异常的捕获和处置v多线程的实现及多线程的实现及Runnable接口的运用接口的运用v流式输入输出的操作、文件读写及随机访问流式输入输出的操作、文件读写及随机访问v基于基于Socket的面向衔接的网络底层通讯及高的面向衔接的网络底层通讯及高层效力层效力9.1 异常处置在Java中,提供了错误捕捉和处置机制,即异常处置机制。
在程序运转过程中发生错误时,Java允许其不按照正常途径完成义务,由发现错误的方法抛出封装了错误信息的对象〔异常〕到其调用程序,发出曾经发生问题的信号,然后立刻退出;而且,程序并不在调用该方法的代码处继续执行,而是由异常处置机制开场搜索一个可以处置这种特定错误情况的异常处置器9.1.1 异常分类 Throwable类派生出两个分支:Error和ExceptionError类被以为是不能恢复的严重错误,如系统内部错误和资源耗尽错误等不应该抛出这种类型的错误,而是让程序中断Exception类定义能够遇到的细微错误,分为派生自RuntimeException类的异常和非派生自RuntimeException类的异常这时,可以写代码来处置异常并继续程序执行,而不是让程序中断区分RuntimeException和非RuntimeException的规那么是:编程错误导致RuntimeException,如被零除、数组越界访问、空指针访问等;而其他异常那么是由于不测情况而发生的,如试图读取文件结尾以后的数据、试图翻开错误的URL、试图根据并不代表已存在类的字符串来查找Class对象等9.1.2 方法如何抛出异常 //本方法从长度为2048字节的某文件中读入数据到字符串对象中。
String readFile(BufferedReader in) throws EOFException{...while(...){//ch为当前读入的字符if(ch == -1) //文件尾;{//当n 运转结果如下:Caught the Exception!!!e.getMessage(): I throw an Exception!!!【例9.2】重新抛出异常 程序代码见RethrowException .java运转结果如下:the original exception in f()Caught in mainException in thread "main" java.lang.Exception: thrown from f() at RethrowException.f(RethrowException.java:8) at RethrowException.main(RethrowException.java:14)9.1.4创建本人的异常类我们可以创建本人的异常类,以便对特殊的异常进展处置创建的方法很简单:承继现有的异常类例9.3】创建本人的异常类 程序代码见ExceptionInherit .java运转结果如下:Throwing MyExceptionMyException: the second constructor! at ExceptionInherit.f(ExceptionInherit.java:19) at ExceptionInherit.main(ExceptionInherit.java:25)【例9.4】创建具有更多功能的异常类。 程序代码见ExceptionInherit2.java运转结果如下:Throwing MyException2e.value()=4MyException2: the third constructor!!! at ExceptionInherit2.f(ExceptionInherit2.java:29) at ExceptionInherit2.main(ExceptionInherit2.java:35)9.2 Java多线程机制 进程、线程表示图 【例9.5】 未运用多线程技术的记数程序当单击“Start〞按钮时,屏幕上方的文本框开场递增记数,从0到49在记数过程单击“Close〞按钮不起作用,记数依然在继续;当记数到49时,程序退出 程序代码见Counter .java运转结果如下: 9.2.1创建线程创建线程:将需求独立运转的子义务代码放到从Thread类派生出来的类的run方法中然后在主线程中原先调用该子义务的地方先创建一个该线程类的实例,再调用线程类中的start方法启动线程例9.6】运用线程技术的记数程序 在记数过程中,当单击“Close〞按钮时,程序立刻会退出。 程序代码见CounterThread .java运转结果如下:9.2.2 实现多个线程在以上例子的根底上,创建多个记数线程同时记数例9.7】实现多个记数线程的记数程序 当多次单击“Add〞按钮时,窗口中的文本框会依次添加,每个文本框都执行本人的记数功能 程序代码见CounterMultiThread .java运转结果如下:9.2.3 线程的形状线程形状及形状转换表示图 9.2.4 Runnable接口 前面引见了如何经过创建本人的线程类来实现多线程,即将线程类〔Thread〕与程序的主类〔Main〕分别class CounterSubTask extends Thread{...public void run(){...}}public class CounterMultiThread{public static void main(String[] args){...}}假设CounterSubTask类,也就是run方法所在的类曾经拥有另一个超类,那将无法承继Thread类,此时如何实现多线程呢?典型的情况是,对于一个GUI程序,需求从JFrame或JApplet类派生。 这时,虽然不能承继Thread类,但是可以经过实现Runnable接口来实现多线程【例9.8】 经过Runnable接口实现多个记数线程的Java小运用程序 程序代码见CounterThreadApplet .java运转结果如下: 9.3 流式输入输出与文件处置 在Java中,运用程序所需求读入的数据和写出的数据是经过I/O操作实现的这些读写数据的源或目的包括文件、内存、网络衔接等,其中,最常用的是文件Java中的输入输出流可以分为两大类:输入流和输出流输入流是可以读取字节的对象,而输出流是可以写字节序列的对象最初设计的输入输出类是面向字节流的,即可以支持8位的字节流,分别由派生自笼统类InputStream和OutputStream的类层次来表示但是随着对国际化支持的需求出现,面向字节的流不能很好地处置运用Unicode〔每个字符运用两个字节〕的数据,因此引入了派生自笼统类Reader和Writer的类层次,用于读写双字节的Unicode字符,而不是单字节字符9.3.1 Java输入输出类库承继关系 面向字节流的输入输出类层次关系图 处置Unicode字符的输入输出类层次关系图 9.3.2基于规范输入输出的IO操作 在Java里,还提供了“规范输入流〞和“规范错误输出流〞 , 分 别 对 应 于 System.in和 System.err。 System.out和System.err曾经被封装成PrintStream对象,因此具有强大的输出功能;但是System.in却依然是原始的InputStream,需求在运用的时候进展封装例9.9】规范输入输出 程序代码见StandardIO .java运转结果如下:Enter String: abcdeAbcdeEnter an Integer: -12345-12345Enter a Double: -12345-12345.0【例9.10】构造化数据输入输出和数据分隔 程序代码见TokenStandardIO .java运转结果如下:The number 1 personEnter name,age,salary,married(optional), please separate fields by ':‘张三:25:3000The number 2 personEnter name,age,salary,married(optional), please separate fields by ':‘李四:35:10000:YThe number 3 personEnter name,age,salary,married(optional), please separate fields by ':‘王大五:30:4000:FOutput the data of people:The number 1 personname: 张三; age:25; salary: 3000.0; married: FThe number 2 personname: 李四; age:35; salary: 10000.0; married: YThe number 3 personname: 王大五; age:30; salary: 4000.0; married: F9.3.3文件读写及随机访问 文件是保管在磁盘等二级存储设备上的数据,由记录组成,文件中的一行可以看作是一条记录。 对文件的读写和规范输入输出是非常类似的,需求留意的是要采用专门对文件操作的流,并应该在适宜的时候封锁流,否那么系统资源无法得到释放对于输出流,假设不执行封锁流的操作,那么缓冲区的数据将有能够没有写入文件,呵斥文件损坏例9.11】文件读写 将规范输入的数据写到文件中,然后再从文件中读取数据,并输出到规范输出 程序代码见FileRW .java运转结果如下:The number 1 personEnter name,age,salary,married(optional), please separate fields by ':'张三:25:3000The number 2 personEnter name,age,salary,married(optional), please separate fields by ':'李四:35:10000:YThe number 3 personEnter name,age,salary,married(optional), please separate fields by ':'王大五:30:4000:FPerson[name=张三,age=25,salary=3000.0,married=F]Person[name=李四,age=35,salary=10000.0,married=Y]Person[name=王大五,age=30,salary=4000.0,married=F]同时,当前目录下应有文件“people.dat〞,其内容为:3张三:25:3000.0:F李四:35:10000.0:Y王大五:30:4000.0:F【例9.12】文件随机访问 。 先把定长的记录写入文件中,然后逆序读取并显示,在修正文件的最后一条记录后,再写入文件 程序代码见FileRandomRW .java程序执行后,当前目录下应该有“peoplerandom.dat〞文件,运转结果如下:原始数据:Person[name=张三,age=25,salary=3000.0,married=F]Person[name=李四,age=35,salary=10000.0,married=Y]Person[name=王大五,age=30,salary=4000.0,married=F]修正后的记录Person[name=王大五,age=30,salary=4500.0,married=F]9.3.4Java的文件管理 对于文件或目录的其他操作,如重命名、删除、列表显示等,需求运用Java的文件管理File类 在Java中,文件和目录都是用File对象来表示的,创建和区分方法:先创建一个File对象,并指定文件名或目录名,假设指定文件名或目录名不存在,那么File对象的新建并不会创建一个文件或目录;需求用createNewFile方法或mkdir方法来分别创建文件或目录。 区分File对象代表的是文件还是目录,可以经过isFile方法和isDirectory方法来判别File currentPath = new File(args[0]);//在指定目录新建temp目录的File对象File tempPath= new File(currentPath, "temp");tempPath.mkdir(); //在指定目录下创建temp目录//在temp目录下创建文件File temp1= new File(tempPath, "temp1.txt");temp1.createNewFile();【例9.13】文件管理 先在指定目录下创建名为“temp〞的子目录,在“temp〞目录下创建两个文件:“temp1.txt〞、“temp2.txt〞,然后列表显示指定目录;重命名“temp1.txt〞为“temp.txt〞,然后列表显示“temp〞目录;删除文件“temp2.txt〞,然后列表显示“temp〞目录程序代码见FileDirectory.ava运转命令:E:\demo>java FileDirectory运转结果如下:显示指定目录的内容1.Ppt2.Xls3.DocFileDirectory.javaFileDirectory.classE:\demo\temptemp1.txttemp2.txt更改文件名后,显示temp子目录的内容temp.txttemp2.txt删除文件后,显示temp子目录的内容temp.txt9.4 Java网络通讯传统的网络编程是一项非常细节化的任务,程序员必需处置和网络有关的大量细节,如各种协议,甚至要了解网络相关的硬件知识。 而Java那么将底层的网络通讯细节予以屏蔽,使得运用的编程模型是一个文件模型,也就是说,可以象操作流一样来操作网络数据传输另外,由于在网络衔接中,通常都需求一个效力器同时为多个客户端效力,因此Java的多线程机制也大派用场9.4.1网络根底知识及Java网络模型Java网络模型图 9.4.2面向衔接的流式套接字 【例9.14】具有“回显〞功能的效力器端和客户端程序效力器端的程序将等待客户端的输入,然后将客户端的输入回显给客户端,同时在效力器端的控制台输出而客户端从控制台接纳输入后,向效力器端发送输入,并接纳效力器端的回显数据,然后显示在控制台 程序代码见EchoServer.java和EchoClient.java效力器端程序运转结果如下:Started: ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=9999]Connection accepted: Socket[addr=/127.0.0.1,port=1623,localport=9999]Hello! Enter BYE to exit.Echo: abcEcho: cdeEcho: efgThe client entered BYE!Connection will be closed!客户端程序运转结果如下:socket = Socket[addr=localhost/127.0.0.1,port=9999,localport=1623]Enter a string, Enter BYE to exit!AbcEcho: abcCdeEcho: cdeEfgEcho: efgBYE【例9.15】支持多客户端的“回显〞效力器端程序。 程序代码见EchoServerThread .java我们先启动效力器端,然后启动两个客户端效力器端程序运转结果如下:Started: ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=9999]Connection 1 accepted: Socket[addr=/127.0.0.1,port=1656,localport=9999]Hello! Enter BYE to exit.Connection 2 accepted: Socket[addr=/127.0.0.1,port=1657,localport=9999]Hello! Enter BYE to exit.Echo 1: abcEcho 2: ABCEcho 2: CDEEcho 1: cdeEcho 2: EFGThe client 2 entered BYE!Connection 2 will be closed!Echo 1: efgEcho 1: hijkThe client 1 entered BYE!Connection 1 will be closed!第一个客户端运转结果如下:socket = Socket[addr=localhost/127.0.0.1,port=9999,localport=1656]Enter a string, Enter BYE to exit!abcEcho 1: abccdeEcho 1: cdeefgEcho 1: efghijkEcho 1: hijkBYE第二个客户端运转结果如下:socket = Socket[addr=localhost/127.0.0.1,port=9999,localport=1657]Enter a string, Enter BYE to exit!ABCEcho 2: ABCCDEEcho 2: CDEEFGEcho 2: EFGBYE9.4.3无衔接的数据报 对于类似传输速度更重要的运用,运用无衔接的数据报协议UDP,即“用户数据报协议〞。 UDP并不刻意追求数据包会完全发送出去,也不能担保它们抵达的顺序与它们发出时一样,因此,这是一种“不可靠协议〞由于其速度比TCP快得多,所以还是可以在很多运用中运用Java对数据报的支持与它对TCP套接字的支持大致一样,运用DatagramSocket类来表示无衔接的socket,接纳和发送数据报接纳和要发送的数据报内容保管在DatagramPacket对象中UDP也有本人的端口,和TCP端口是相互独立的也就是说,可以在端口8080同时运转一个TCP和UDP效力程序,两者之间不会产生冲突9.4.4 Java访问网络资源 在因特网上,曾经开发了许多效力,如WWW阅读、Email等,而Java也提供了相应的扩展组件,如对于Email运用,Java提供了JavaMail API,运用时只需求调用其提供的方法就可以完成如发送邮件的操作:Transport.send(message);在因特网上,我们运用通用资源定位符URL〔Uniform Resource Locator〕来查找资源URL包含了用于查找某个资源的信息,如一张图片、一个文件等URL资源可以包括很多种,如HTTP资源、FTP资源等。 下面就是一个图像资源的URL,属于HTTP资源waterpub/images/cwpp_logo1.gif【例9.16】从网络获取图像资源 程序代码见InternetAccess.java程序运转结果如下:本章小结 经过本章的学习,了解了Java异常处置、多线程机制、流式IO以及网络通讯的根本概念和模型在异常处置中,经过Java言语提供的先进的错误纠正与恢复机制,可以有效地加强代码的强壮程度,并运用尽能够精简的代码创建大型、可靠的运用程序,同时排除程序里那些不能控制的错误Java强迫遵守违例一切方面的问题,所以无论库设计者还是客户程序员,都可以延续一致地运用它运用多线程机制的主要目的是对大量义务进展有序的管理,从而可以经过“轻度〞切换来更有效地利用计算机资源,或者对用户来说运用界面更加友好,相比进程之间的“重度〞切换,效率得到很大提高有效利用计算机资源的典型运用是在IO等候期间如何利用CPU;用户方面的界面友好性的典型表达是如何在一个长时间的数据下载过程中灵敏地对“停顿〞〔stop〕操作进展反响在流式输入输出中,Java提供了经过控制台、文件、内存块甚至因特网等多种不同数据源或目的进展不同方式访问的流库。 经过对流过滤器的正确运用,将提供灵敏的I/O操作Java不仅提供了对文件的流式访问,而且提供了随机访问和文件管理在网络通讯中,Java不仅提供了面向衔接和无衔接数据报的底层通讯,而且还提供了高层效力,如Email和WWW效力等经过Java提供的网络功能,可以以流的方式来进展网络数据的传输,而且不需求关注连网的细节问题。






![河南新冠肺炎文件-豫建科[2020]63号+豫建科〔2019〕282号](http://img.jinchutou.com/static_www/Images/s.gif)





