全国二级Java考试中的几个难点.ppt
全国二级Java考试中的几个难点,输入输出流和文件处理Java的多线程机制Applet类与Applet小程序Java的异常处理,1 输入输出流和文件处理,1.1 流的概念流是指在计算机的输入与输出之间运动的数据的序列。输入流代表从外设流入计算机的数据序列,输出流代表从计算机流向外设的数据序列。流的最大特点是:数据的获取和发送均按数据序列顺序进行。Java中的流分为两种(被抽象为四个类):字节流:InputStream类和OutputStream类 字符流:Reader类和 Writer类 字符流比字节流更有效。,1.字节流,从抽象类InputStream和OutputStream派生出来的一系列类,这类流以字节(byte)为基本处理单位。,基本输入流类InputStream的常用方法,从流中读取数据:int read();/读取一个字节,返回值为所读的字节 int read(byte b);读取多个字节,放置到字节数组b中,通常读取的字节 数量为b的长度,返回值为实际读取的字节的数量int read(byte b,int off,int len);读取len个字节,放置到以下标off开始字节数组b中,返回值为实际读取的字节的数量 int available();/返回值为流中尚未读取的字节的数量long skip(long n);/读指针跳过n个字节不读,返回值为实际跳过的字节数量 关闭流:close();/流操作完毕后必须关闭,基本输出流类OutputStream 的常用方法,输出数据:void write(int b);/往流中写一个字节bvoid write(byte b);/往流中写一个字节数组bvoid write(byte b,int off,int len);把字节数组b中从下标off开始、长度为len的字节写入流中 flush()/刷空输出流,并输出所有被缓存的字节 由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。关闭流:close();/流操作完毕后必须关闭,2 字符流,从抽象类Reader和Writer派生出的一系列子类,这类流以16位的Unicode码表示的字符(一个字符由两个字节组成)为基本处理单位。常用字符流子类和功能,1.2 基本流,1.键盘输入和格式化输出 Java有3个内置的标准流对象:1)标准输入流System.in:用来读取用户从键盘的输入 2)标准输出流System.out:用来在屏幕上显示信息 3)标准输出流System.err:用来显示出错信息(1)键盘输入:使用System.in对象的read()方法 例:char c=(char)System.in.read();使用InputStreamReader、BufferReader流类例:InputStreamReader isr=new InputStreamReader(System.in);BufferReader br=new BufferReader(isr);,(2)格式化输出,用Java的标准输出System.out,可以输出不同类型的对象:例:Int a=20;System.out.print(a)System.out.println(“大家好”)/加换行 用java.text包中的NumberFormat类可以控制显示格式,有三种方法:NumberFormat.getNumberInstance()/附加逗号NumberFormat.getCurrencyInstance()/货币符号NumberFormat.getPercentInstance()/百分号,1.3 文件类,1.Java程序的文件与目录管理 Java.io包中的File类专门用来管理磁盘文件和目录。每个File类的对象表示一个磁盘文件或目录,对象属性中包含名称、长度、所含文件个数等信息。(1)创建File类对象的三种方法:File(String path);指明磁盘文件或目录名及其路径 注意:目录分隔符用System.dirSep表示 如:File f1=new File(“c:”+System.dirSep+”sj”)File(String path,String name);,文件或目录的路径,文件或目录名,File(File dir,String name);(2)获取文件或目录属性,已经存在的磁盘目录,(3)文件或目录的操作,注意:由于Java Applet程序是从网络上下载到本地机器运行的,不可知也不可控,所以Java的安全机制禁止Java Applet程序访问和存取本地文件,如果试图在Java Applet程序中使用文件操作,则将引发Java的安全性异常。,文件操作例子,2.写文本文件,方法一:用FileOutputStream打开文件my.txt,然后用PrintStream 对象p的println方法把字符串写入文件中。例:FileOutputStream fout=new FileOutputStream(“my.txt”)PrintStream p=new PrintStream(fout);p.println(“要写入文本文件中的内容”);p.close();,写文本例子1,方法二:用FileWriter打开文件myf.txt,又创建了文本输出流out,然后用out 的print(或者println)方法把字符串写入文件中。例:FileWriter fw=new FileWriter(“myf.txt”);PrintWriter out=new PrintWriter(fw);out.print(“要写入文本文件中的内容”);out.close();/关于输出 fw.close();/关闭文件,写文本例子2,3.读文本文件,方法一:用FileInputStream打开文件my.txt,然后建立DataInputStream的 对象in(文件流),使用in的readLine()方法以一行为单位读出my.txt文件中的所有字符串。例:FileInputStream fs=new FileInputStream(“my.txt”)DataInputStream in=new DataInputStream(fs);while(in.available()!=0)System.out.println(in.readLine();in.close();/关闭输入流,读文本例子1,方法二:用FileReader打开文件myf.txt,然后用BufferedReader类的对象br作为文件流,用br 的readline()读取文件中的字符串。例:FileReader fr=new FileReader(“myf.txt”);BufferedReader br=new BufferedReader(fr);String record=new String();Int recCount=0;While(record=br.readLine()!=null)recCount+;System.out.println(recCount+”:”+record);br.close();/关于缓存 fr.close();/关闭文件,读文本例子2,4.程序对文件的随机访问,用RandomAccessFile类可以实现对文件的随机读写操作,即可以在文件的任意位置执行数据读写;创建RandomAccessFile的对象例:File mf=new File(“myf.txt”);RandomAccessFile myRAF=new RandomAccessFile(mf,”rw”);,访问模式:rw:可读、可写 r:只读,作为数据源的文件,对文件进行读写操作,RandomAccessFile类实现了DataInput和 DataOutput接口,在读/写时具备强大的含类型转换的输入/输出功能;RandomAccessFile类的所有方法都有可能抛出IOException异常,在利用它实现文件操作时需要将相关语句放在try块中,并配上catch块来处理异常。,文件访问例子,2 Java的多线程机制,2.1 Java中的线程1.程序、进程与线程的区别,线程是比进程更小的执行单位,一个进程在执行过程中可以产生多个线程,每个线程有自己的产生、存在、消亡的过程。线程间可以共享相同的内存单元,实现数据交换、实时通信和同步操作。,进程是程序的一次动态执行过程(放电影),对应着代码加载、执行到执行完毕的全过程。每一个进程都有自己独立的一块内存空间、一组系统资源。在进程概念中,每一个进程的内部数据和状态都是完全独立的。,程序是一段静态的代码,是应用软件执行的蓝本(电影胶片)。,Java的多线程,Java内在支持多线程,它的所有类都是在多线程下定义的,Java利用多线程可以开发能同时处理多个任务的功能强大的应用程序。Java程序通过流控制来执行程序流,程序中单个顺序的流控制称为线程,多线程则指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务。多线程意味着一个程序的多行语句可以看上去几乎在同一时间内同时运行。,使用多线程的好处:,使UI交互的响应更块充分利用多处理器系统简化建模执行异步和后台处理,Java中的线程由三部分组成:1.虚拟的CPU,封装在类中2.CPU所执行的代码,传递给Thread类3.CPU所处理的数据,传递给Thread类,Java中的线程多任务示意图,2.2 线程的状态与生命周期,start(),sleep()时间到,获得锁,wait(),scheduler(),yield(),sleep()或join(),run()方法结束,synchronized,notify()notifyAll(),Interrupt(),(1)创建状态(new Thread)执行下列语句时,线程就处于创建状态:Thread myThread=new Thread();当一个线程处于创建状态时,它仅仅是一个空的线程对象,系统不为它分配资源。,(2)可运行状态(Runnable)Thread myThread=new Thread();myThread.start();当一个线程处于可运行状态时,系统为这个线程分配了它需的系统资源,这样该线程处于运行就绪状态,系统中可以同时有多个线程处于Runnable 状态。(3)运行状态(Running)是线程占有CPU并实际运行的状态。,(4)阻塞状态(Blocked)阻塞状态也称为不可运行状态。因为某种原因(输入/输出、等待消息或其它阻塞情况),系统不能执行线程的状态。这时即使处理器空闲,也不能执行该线程。进入不可运行状态的原因有如下几条:1)调用了sleep()方法,休眠时间到即进入可运行状态;2)调用了t.join()方法,当t线程结束或等待时间 到即进入可运行状态;3)为等候一个条件变量,线程调用wait()方法;4)输入输出流中发生线程阻塞;,线程的终止一般可通过两种方法实现:自然撤消(线程执行完)被停止(调用stop()方法)目前不推荐通过调用stop()来终止线程的执行,而是让线程执行完。,(5)死亡状态(Dead),使用线程时要注意线程的同步,可以用synchronized来修饰那些不能被中途打扰的方法。,2.3 如何在程序中实现多线程,1.创建用户自定义的一个线程子类 即创建Thread类的子类,继承线程类Thread并重写其中的方法 run(),Thread类综合了Java程序中一个线程需要拥有的属性和方法。由于Java只支持单重继承,用这种方法定义的类不能再继承其它父类。关键性操作步骤:(1)定义用户线程的操作,即定义用户线程的 run()方法(2)在适当时候建立用户线程实例。,关于Thread类:(1)构造函数 public Thread():创建一个系统线程类的对象。public Thread(Runnable target):在上一个构造函数完成的操作基础之上,利用参数对象实现了Runnable接口的target对象中所定义的run()方法,来初始化或覆盖新创建的线程对象的run()方法。public Thread(String ThreadName):在第一个构造函数工作的基础上,为所创建的线程对象指定一个字符串名称供以后使用。public Thread(Runnable target,String ThreadName):实现,两构造函数的功能。,(2)线程优先级,Thread类有三个有关线程优先级的静态常量:MIN-PRIORITY 代表最小优先级,通常为1;MAX-PRIORITY 代表最高优先级,通常为10;NORM-PRIORITY 代表普通优先级,缺省数值为5(3)Thread类的常用方法 start()调用该方法启动线程 run()线程被调度后执行的动作 sleep(int millsecond)让线程放弃CUP资源休眠一段时间 isAlive()判断线程是否处于存活状态 currentThread()返回当前正在使用CUP资源的线程 interrupt()吵醒处于sleep状态的线程,2.在用户自己的类中实现Runnable接口,即实现Runnable接口的用户类必须实现其唯一的方法run()。一个实现了Runnable接口的类实际上定义了一个主线程之外的新线程的操作。实现接口Runnable的类仍然可以继承其它父类。关键性操作步骤:定义run()方法的具体内容 当用户程序需要建立新线程时,只要以这个实现了run()方法的类为参数创建系统类thread的对象,就可以把用户实现的run()方法继承过来。,关于Runnable接口:,Runnable接口只有一个方法run(),所有实现Runnable接口的用户类都必须具体实现这个run()方法,为它书写方法体并定义具体操作。Runnable接口中的这个run()方法是一个较特殊的方法,它可以被运行系统自动识别和执行。当线程被调度并转入运行状态时,它所执行的就是run()方法中规定的操作。,Runnable例子,实现多线程的两种方法的比较:,1.使用Runnable接口1)可以将CPU、代码和数据分开,形成清晰的模型;2)还可以从其他类继承;3)保持程序风格的一致性。2.直接继承Thread类1)不能再从其他类继承;2)编写简单,可以直接操纵线程,无需使用 Thread.currentThread()。,3 Applet类与Applet小程序,3.1 Applet的基本工作原理 Java Applet是通过兼容Java的Internet浏览器来解释执行的。编译好的Java字节码文件保存在特定的WWW服务器上,当浏览器遇到网页中嵌入的标记时,就会根据该Applet的名字和位置自动把字节码从服务器上下载到本地,并利用浏览器本身拥有的Java解释器直接执行该字节码。由于有浏览器的支持,Applet不需要建立自己的主流程框架,也不需要有专门的图形界面。Applet需要做的是接收和响应浏览器发来的消息或事件。,3.2 Applet类,(1)Applet类简介 它是Java类库中一个重要的系统类,存在于java.applet包中。Applet类是Java的系统类java.Awt.Panel的子类。Panel属于一种容器,作用是:包容和排列其他的界面元素,如按钮、对话框等 响应它所包容范围之内的事件,或把事件向更高层次传递。Applet在此基础上,还具有一些与浏览器和Applet生命周期有关的专门方法。,(2)Applet类的主要方法,1)init()方法 用来完成主类实例的初始化工作。如:创建和初始化程序运行所需要的对象实例,把图形或字体加载入内存,设置各种参数,加载图形和声音并播放等。2)start()方法 用来启动浏览器运行Applet的主线程。浏览器在调用init()方法初始化Applet类的实例之后,接着会自动调用start()方法,除此之外,start()方法在Applet被重新启动时也会被系统自动调用。3)stop()方法 类似于start()方法的逆操作,当用户浏览其它页面,或切换到其他系统应用时,浏览器将自动调用stop()方法暂停执行Applet的主线程。,4)paint()方法 主要用来在Applet的界面中显示文字、图形和其他界面元素,也是浏览器自动调用的方法。导致浏览器调用paint()方法的事件主要有三种:Applet被启动后,自动调用paint()来重新描绘自己的界面;Applet所在的浏览器窗口改变时,要求自动调用paint()来重画界面;Applet的其他方法被调用时,系统也会调用此方法。paint()方法有一个固定的参数Graphics类的对象g。Graphics类是用来完成一些较低级的图形用户界面操作的类,其中包括画圆、点、线、多边形及显示简单文本。,5)destroy()方法 当用户退出浏览器时,浏览器自动调用Applet 实例的destroy()方法完成释放资源、关闭连接之类的操作。Applet的生命周期与主要方法,3.3 HTML文件参数传递,Applet通过标记 嵌入在HTML文件中,至少需要包括三个参数:code、height、width。其它可选参数如下:(1)codebase 当Applet字节码文件的保存位置与所嵌入的HTML文档不同时,需要用此参数指明字节码文件的位置,该位置用URL格式表示。(2)alt 如果浏览器不包含Java解释器,则不能执行字节码文件,此时可用alt参数告诉用户此浏览器不支持Java。(3)align 表示Applet界面区域在浏览器窗口中的对齐方式。,HTML文件可以通过标记向它所嵌入的Applet传递参数,使Applet的运行更加灵活。格式为:标记只能传递一个字符串类型的参数。Applet利用getParamter()方法来获取HTML传递来的参数,方法中用name指定的参数名。格式:getParamter(”x”),4 Java的异常处理,4.1 编程中的错误 编程中的错误分为编译错误和运行错误。编译错误:程序由于语法的原因无法通过由源代码到目标码的编译而产生的错误。运行错误:系统错误:引发操作系统问题的错误,如死循环、死机;逻辑错误:无法实现设计意图和功能的错误,如算法考虑不周、边界条件不正确。,4.2 异常与异常类,(1)Java 的异常处理机制 异常是特殊的错误运行对象,又称例外,对应着Java语言特定的运行错误处理机制。为了能够及时有效地处理程序中的运行错误,Java引入了异常和异常类。异常是异常类的对象。一旦一个异常对象产生了,系统中就一定有相应的机制来处理它,确保不会产生死机、死循环或其它对操作系统的损害,保证整个程序运行的安全性。,(2)异常类结构与组成 每一种类对应一种特定的错误;异常类都是系统Exception类的子类.,Throwable类,Exception类,Error类,IOException,RuntimeException,InterruptedException,ClassNotFoundException,IllegalAccessException,AWTException,Throwable类是类库java.lang包中的一个类,派生两个子类:Exception和ErrorException类有两个构造函数:public Exception();public Exception(String s);其中s是对该例外所对应的错误的描述。从父类Throwable继承的常用方法:1)public String toString();该方法返回描述当前Exception类信息的字符串。2)public void printStackTrace();该方法的功能是完成一个打印操作,在屏幕上输出当前例外对象的堆栈使用轨迹,即程序先后调用了哪些对象或类的方法,使得运行过程中产生了这个例外对象。,(3)系统定义的运行异常与所对应的系统运行错误,(4)用户自定义的异常,作用:用来处理程序中特定的逻辑运行错误。创建用户自定义异常时,一般需要完成如下工作:(1)声明一个新的异常类,使之以Exception类或其他某个已经存在的系统异常类或用户异常类为父类;(2)为新的异常类定义属性和方法,或重载父类的属性和方法,使这些属性和方法能够体现该类所对应的错误的信息。定义足够多的异常类是构建一个稳定完善的应用系统的重要基础之一。,4.3 异常的抛出,Java程序在运行时如果由于可识别的错误,系统就产生一个与该错误相对应的异常类的对象,这个过程就是异常的抛出。(1)系统自动抛出的异常 所有系统定义的运行异常都可以由系统自动抛出。例:public class TestSystemException public static void main(String args)int a=0,b=5;System.out.println(b/a);/以零为除数,引发系统定义的算术异常,(2)语句抛出的异常 用户程序定义的异常不可能靠系统自动抛出,必须借助throw语句定义何种情况才算产生了此种异常对应的错误,并抛出这个异常类的新对象。语法:修饰符 返回类型 方法名(参数列表)throws 异常类名列表.throw 异常类名;.对有可能出现异常的方法,用throws语句列出可能出现的异常类名,这样当发生异常时,系统就调用异常处理程序。,注意的问题:,(1)一般这种抛出异常的语句应该被定义为在满足一定条件时执行,如在if语句的条件分支中。(2)含有throw语句的方法,应该在方法头定义中增加如下的部分:throws 异常类名列表(3)由于系统不能识别和创建用户自定义的异常,所以需要编程者在程序中的合适位置创建自定义异常的对象,并利用throw语句将这个新异常对象抛出。,4.4 异常的处理,包括捕捉异常、程序流程的跳转和异常处理语句块的定义。(1)捕捉异常 异常被抛出时,用专门的语句来接收异常对象,格式如下:catch(异常类名 异常形式参数名)异常处理语句;,Java语言规定:每个catch语句块都应该与一个try语句块相对应,这个try语句块用来启动Java的异常处理机制,可能抛出异常的语句(包括throw语句、调用可能抛出异常方法的方法调用语句)都应该包含在这个try语句块中。,(2)多异常处理 通过一个try块后面定义若干个catch块来实现,每个catch块用来接收和处理一种特定的异常对象。注意如下问题:1)catch块中的语句应根据异常的不同执行不同的操作;2)处理多异常时应注意设计各catch块的排列顺序,一般处理较具体和常见的异常应放在前,可以与多种异常相匹配的应放在后;否则可能造成它后面的catch块将永远不被使用。,