Java高级编程java.ppt

上传人:max****ui 文档编号:6366637 上传时间:2020-02-24 格式:PPT 页数:37 大小:639.81KB
返回 下载 相关 举报
Java高级编程java.ppt_第1页
第1页 / 共37页
Java高级编程java.ppt_第2页
第2页 / 共37页
Java高级编程java.ppt_第3页
第3页 / 共37页
点击查看更多>>
资源描述
学习导读本章将介绍Java语言中的一些高级特性 异常处理 多线程机制 流式IO以及网络通信 其中每个部分都能扩展成一个专题 读者在本章学习到的只是其中很小的一部分 但是能够从中了解一些基本概念和基本操作 为今后的深入学习打下基础 异常处理提供对错误的捕捉和处理机制 多线程机制使得程序的多个子任务能够 同时 执行 流式IO提供了对输入输出的读写机制 网络通信特性允许Java程序通过Socket实现底层通信 并利用Java提供的扩展组件实现高层服务 第九章Java高级编程 教学重点与难点 异常处理 多线程机制 流式IO以及网络通信的基本概念和模型异常的捕获和处理多线程的实现及Runnable接口的应用流式输入输出的操作 文件读写及随机访问基于Socket的面向连接的网络底层通信及高层服务 9 1异常处理 在Java中 提供了错误捕捉和处理机制 即异常处理机制 在程序运行过程中发生错误时 Java允许其不按照正常路径完成任务 由发现错误的方法抛出封装了错误信息的对象 异常 到其调用程序 发出已经发生问题的信号 然后立即退出 而且 程序并不在调用该方法的代码处继续执行 而是由异常处理机制开始搜索一个能够处理这种特定错误情况的异常处理器 9 1 1异常分类 Throwable类派生出两个分支 Error和Exception Error类被认为是不能恢复的严重错误 如系统内部错误和资源耗尽错误等 不应该抛出这种类型的错误 而是让程序中断 Exception类定义可能遇到的轻微错误 分为派生自RuntimeException类的异常和非派生自RuntimeException类的异常 这时 可以写代码来处理异常并继续程序执行 而不是让程序中断 区分RuntimeException和非RuntimeException的规则是 编程错误导致RuntimeException 如被零除 数组越界访问 空指针访问等 而其他异常则是由于意外情况而发生的 如试图读取文件结尾以后的数据 试图打开错误的URL 试图根据并不代表已存在类的字符串来查找Class对象等 9 1 2方法如何抛出异常 本方法从长度为2048字节的某文件中读入数据到字符串对象中 StringreadFile BufferedReaderin throwsEOFException while ch为当前读入的字符 if ch 1 文件尾 当n len 意味着还未将文件全部读入字符串 就遇到文件结束标志 视为异常情况 if n len thrownewEOFException 或者采用下面的方法 if n len EOFExceptionreadeof newEOFException throwreadeof returns 9 1 3捕获及处理异常 try 可能产生异常的代码 try块 catch ExceptionType1e1 要捕获的异常类型1 对此异常的处理 异常处理1 catch ExceptionType2e2 要捕获的异常类型2 对此异常的处理 异常处理2 catch ExceptionType3e3 要捕获的异常类型3 对此异常的处理 异常处理3 例9 1 捕获并处理异常程序代码见ExceptionExample java 运行结果如下 CaughttheException e getMessage IthrowanException 例9 2 重新抛出异常程序代码见RethrowException java 运行结果如下 theoriginalexceptioninf CaughtinmainExceptioninthread main java lang Exception thrownfromf atRethrowException f RethrowException java 8 atRethrowException main RethrowException java 14 9 1 4创建自己的异常类 我们可以创建自己的异常类 以便对特殊的异常进行处理 创建的方法很简单 继承现有的异常类 例9 3 创建自己的异常类 程序代码见ExceptionInherit java 运行结果如下 ThrowingMyExceptionMyException thesecondconstructor atExceptionInherit f ExceptionInherit java 19 atExceptionInherit main ExceptionInherit java 25 例9 4 创建具有更多功能的异常类 程序代码见ExceptionInherit2 java 运行结果如下 ThrowingMyException2e value 4MyException2 thethirdconstructor atExceptionInherit2 f ExceptionInherit2 java 29 atExceptionInherit2 main ExceptionInherit2 java 35 9 2Java多线程机制 进程 线程示意图 例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 4Runnable接口 前面介绍了如何通过创建自己的线程类来实现多线程 即将线程类 Thread 与程序的主类 Main 分离 classCounterSubTaskextendsThread publicvoidrun publicclassCounterMultiThread publicstaticvoidmain 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 1Java输入输出类库继承关系 面向字节流的输入输出类层次关系图 处理Unicode字符的输入输出类层次关系图 9 3 2基于标准输入输出的IO操作 在Java里 还提供了 标准输入流 和 标准错误输出流 分别对应于System in和System err System out和System err已经被封装成PrintStream对象 因此具有强大的输出功能 但是System in却仍然是原始的InputStream 需要在使用的时候进行封装 例9 9 标准输入输出 程序代码见StandardIO java 运行结果如下 EnterString abcdeAbcdeEnteranInteger 12345 12345EnteraDouble 12345 12345 0 例9 10 结构化数据输入输出和数据分隔 程序代码见TokenStandardIO java 运行结果如下 Thenumber1personEntername age salary married optional pleaseseparatefieldsby 张三 25 3000Thenumber2personEntername age salary married optional pleaseseparatefieldsby 李四 35 10000 YThenumber3personEntername age salary married optional pleaseseparatefieldsby 王大五 30 4000 FOutputthedataofpeople Thenumber1personname 张三 age 25 salary 3000 0 married FThenumber2personname 李四 age 35 salary 10000 0 married YThenumber3personname 王大五 age 30 salary 4000 0 married F 9 3 3文件读写及随机访问 文件是保存在磁盘等二级存储设备上的数据 由记录组成 文件中的一行可以看作是一条记录 对文件的读写和标准输入输出是十分类似的 需要注意的是要采用专门对文件操作的流 并应该在合适的时候关闭流 否则系统资源无法得到释放 对于输出流 如果不执行关闭流的操作 则缓冲区的数据将有可能没有写入文件 造成文件损坏 例9 11 文件读写 将标准输入的数据写到文件中 然后再从文件中读取数据 并输出到标准输出 程序代码见FileRW java 运行结果如下 Thenumber1personEntername age salary married optional pleaseseparatefieldsby 张三 25 3000Thenumber2personEntername age salary married optional pleaseseparatefieldsby 李四 35 10000 YThenumber3personEntername age salary married optional pleaseseparatefieldsby 王大五 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方法来判断 FilecurrentPath newFile args 0 在指定目录新建temp目录的File对象 FiletempPath newFile currentPath temp tempPath mkdir 在指定目录下创建temp目录 在temp目录下创建文件 Filetemp1 newFile 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 javaFileDirectory运行结果如下 显示指定目录的内容1 Ppt2 Xls3 DocFileDirectory javaFileDirectory classE demo temptemp1 txttemp2 txt更改文件名后 显示temp子目录的内容temp txttemp2 txt删除文件后 显示temp子目录的内容temp txt 9 4Java网络通信 传统的网络编程是一项非常细节化的工作 程序员必须处理和网络有关的大量细节 如各种协议 甚至要理解网络相关的硬件知识 而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 Connectionaccepted Socket addr 127 0 0 1 port 1623 localport 9999 Hello EnterBYEtoexit Echo abcEcho cdeEcho efgThecliententeredBYE Connectionwillbeclosed 客户端程序运行结果如下 socket Socket addr localhost 127 0 0 1 port 9999 localport 1623 Enterastring EnterBYEtoexit AbcEcho abcCdeEcho cdeEfgEcho efgBYE 例9 15 支持多客户端的 回显 服务器端程序 程序代码见EchoServerThread java 我们先启动服务器端 然后启动两个客户端 服务器端程序运行结果如下 Started ServerSocket addr 0 0 0 0 0 0 0 0 port 0 localport 9999 Connection1accepted Socket addr 127 0 0 1 port 1656 localport 9999 Hello EnterBYEtoexit Connection2accepted Socket addr 127 0 0 1 port 1657 localport 9999 Hello EnterBYEtoexit Echo1 abcEcho2 ABCEcho2 CDEEcho1 cdeEcho2 EFGTheclient2enteredBYE Connection2willbeclosed Echo1 efgEcho1 hijkTheclient1enteredBYE Connection1willbeclosed 第一个客户端运行结果如下 socket Socket addr localhost 127 0 0 1 port 9999 localport 1656 Enterastring EnterBYEtoexit abcEcho1 abccdeEcho1 cdeefgEcho1 efghijkEcho1 hijkBYE第二个客户端运行结果如下 socket Socket addr localhost 127 0 0 1 port 9999 localport 1657 Enterastring EnterBYEtoexit ABCEcho2 ABCCDEEcho2 CDEEFGEcho2 EFGBYE 9 4 3无连接的数据报 对于类似传输速度更重要的应用 使用无连接的数据报协议UDP 即 用户数据报协议 UDP并不刻意追求数据包会完全发送出去 也不能担保它们抵达的顺序与它们发出时一样 因此 这是一种 不可靠协议 由于其速度比TCP快得多 所以还是能够在很多应用中使用 Java对数据报的支持与它对TCP套接字的支持大致相同 使用DatagramSocket类来表示无连接的socket 接收和发送数据报 接收和要发送的数据报内容保存在DatagramPacket对象中 UDP也有自己的端口 和TCP端口是相互独立的 也就是说 可以在端口8080同时运行一个TCP和UDP服务程序 两者之间不会产生冲突 9 4 4Java访问网络资源 在因特网上 已经开发了许多服务 如WWW浏览 Email等 而Java也提供了相应的扩展组件 如对于Email应用 Java提供了JavaMailAPI 使用时只需要调用其提供的方法就可以完成如发送邮件的操作 Transport send message 在因特网上 我们使用通用资源定位符URL UniformResourceLocator 来查找资源 URL包含了用于查找某个资源的信息 如一张图片 一个文件等 URL资源可以包括很多种 如HTTP资源 FTP资源等 下面就是一个图像资源的URL 属于HTTP资源 例9 16 从网络获取图像资源 程序代码见InternetAccess java 程序运行结果如下 本章小结 通过本章的学习 了解了Java异常处理 多线程机制 流式IO以及网络通信的基本概念和模型 在异常处理中 通过Java语言提供的先进的错误纠正与恢复机制 可以有效地增强代码的健壮程度 并使用尽可能精简的代码创建大型 可靠的应用程序 同时排除程序里那些不能控制的错误 Java强迫遵守违例所有方面的问题 所以无论库设计者还是客户程序员 都能够连续一致地使用它 使用多线程机制的主要目的是对大量任务进行有序的管理 从而可以通过 轻度 切换来更有效地利用计算机资源 或者对用户来说使用界面更加友好 相比进程之间的 重度 切换 效率得到很大提高 有效利用计算机资源的典型应用是在IO等候期间如何利用CPU 用户方面的界面友好性的典型体现是如何在一个长时间的数据下载过程中灵敏地对 停止 stop 操作进行反应 在流式输入输出中 Java提供了通过控制台 文件 内存块甚至因特网等多种不同数据源或目的进行不同方式访问的流库 通过对流过滤器的正确使用 将提供灵活的I O操作 Java不仅提供了对文件的流式访问 而且提供了随机访问和文件管理 在网络通信中 Java不仅提供了面向连接和无连接数据报的底层通信 而且还提供了高层服务 如Email和WWW服务等 通过Java提供的网络功能 可以以流的方式来进行网络数据的传输 而且不需要关注连网的细节问题
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!