欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    Java的IO流和异常处理-v.ppt

    • 资源ID:6509897       资源大小:1.08MB        全文页数:71页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Java的IO流和异常处理-v.ppt

    4.1 I/O流概述4.2 System I/O类和Scanner类 4.2.1 System I/O类 4.2.2 Scanner类4.3 文件类 4.3.1 使用File类访问文件系统 4.3.2 随机文件读写4.4 字节级输入输出流 4.4.1 数据输入输出流 4.4.2 文件输入输出流 4.4.3 缓冲输入输出流 4.4.4 管道输入输出流 4.4.5 格式化输出流,4.5 字符级输入输出类 4.5.1 字符输入输出类 4.5.2 缓冲读写类 4.5.3 文件读写类 4.5.4 格式化写类4.6 对象序列化 4.6.1 对象输入流 4.6.2 对象输出流4.7 异常处理 4.7.1 Java中定义的异常 4.7.2 异常类的层次结构 4.7.3 捕获异常 4.7.4 异常处理的嵌套 4.7.5 自定义的异常和使用,第4章 Java的I/O流和异常处理,第4章 Java的I/O流和异常处理,学习导读 Java中常用I/O流、方法及其应用,包括:System类、Scanner类,字节流和字符流处理,以及对象序列化。Java中的异常处理机制及异常处理。,4.1 I/O流的概念,流是指流动的数据序列,可分为输入流和输出流。在程序设计语言中,流式输入输出是一种常见的输入输出方式。它是一个比文件更加广泛的概念。输入流将外部数据输入到计算机。例如从键盘,扫描仪,摄像头,网络等数据源输入数据。输出流将计算机中的数据输出到外部设备。例如将要打印的信息发送到打印机,将计算的结果显示到输出设备上。流的特点:所有数据的传输都按照数据序列的顺序进行。每个数据依序被读入或写出,Java中采用类的方式实现I/O流。,Java I/O流来自 java.io包中的类,按照流处理的对象,可将输入输出流分为字节级输入输出流、字符级输入输出流和对象级输入输出流。输入输出流类层次如图所示:,InputStream和OutputStream是Java语言中最基本的两个输入输出类。其他所有字节输入输出流类都继承自这两个基类。这两个类都是抽象类,都继承自Object类,因而不能创建它们的实例,只能使用它们的子类。,从输入流读取下一个字节,-1表示输入结束,阻塞方法 abstract int read();从输入流读取一组数据存入缓冲区b中。返回读取的字节个数,-1表示结束 int read(byte b);从输入流读取最多len字节数据存入缓冲区b中,并从数组b的第off个位置开始存放 int read(byte b,int off,int len);返回输入流中无需阻塞可直接读取字节个数 int available();从输入流中忽略n和字节的数据,返回实际忽略的字节个数 long skip(long n);关闭输入流close();,InputStream的主要方法,向输出流写入一个字节,写出 字节为整数b的低字节,其高3个字节被忽略abstract void write(int b);把缓冲区b中的全部数据写入输出流 void write(byte b);把缓冲区b中从boff开始的len个字节的数据写入输出流 void write(byte b,int off,int len);刷新输出流,强制输出所有被缓存的字节 void flush();关闭输出流 void close();在实际应用中,常用InputStream和OutputStream类的引用指向它们的具体实现的子类对象。,OutputStream的方法,4.2 System I/O类和Scanner类System I/O类称为标准输入输出类。在Java中标准的输入设备是键盘,标准的输出设备是终端或显示器。他们分别对应System类中的变量in,out和err。这三个类变量(对象类型)在System类中的声明如下:public static final InputStream in;public static final PrintStream out;public static final PrintStream err;,4.2 System I/O类和Scanner类 对于PrintStream类最常用的两个方法为:public void print();/输出一行字符串public void println();/输出后并换行 例如,输入后立即输出这个数:byte bs=();(bs);,Scanner类 Scanner类是一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器。它使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白字符匹配。再使用不同的next方法将得到的标记转换为不同类型的值。例如,读入一个整数:Scanner sc=new Scanner(System.in);int i=sc.nextInt();,【例4.1】System I/O类和Scanner类,注意,输入流的结束程序运行结果?,4.3 文件类,1.使用File类 Java提供了用于处理有关文件和目录访问的File类。用户通过该类可以实现新建文件、删除文件或目录,以及获取文件或目录属性的功能。File类方法如表所示:,例如,利用File对象创建文件和目录,注意,new操作一定成功吗?程序运行结果?,2.使用RandomAccessFile类 Java提供了RandomAccessFile类,它的实例能同时支持随机存取文件的读写操作,每读取一个字节,指针后移一个字节;写操作也在指针位置写字节,然后指针后移到所写字节之后。RandomAccessFile类有两个构造方法:RandomAccessFile(String filename,String mode);RandomAccessFile(File file,String mode);其中,mode值可以是:,RandomAccessFile类的方法,【例4.2】RandomAccessFile类,注意,写入了基本类型数据程序运行结果?,4.4 字节级输入输出流,1.数据输入输出流(DataInputStream,DataOutputStream)数据输入流,是从一个输入流中读取Java基本类型的数据。数据输出流,向一个输出流写入Java基本类型的数据。它们允许程序以与机器无关的方式读取Java基本类型数据,这些类型在文件中的表示方式与其在内存中的一样,无需转换。其构造方法和一般方法分别是:,2.文件输入输出流(FileInputStream,FileOutputStream)FileInputStream类和类FileOutputStream类分别继承于InputStream类和OutputStream类。这两个类可以打开本地主机上的文件,并进行顺序的读/写。它们的构造方式是:通常与其他字节输入输出类结合使用。,【例4.3】DataInputStream/DataOutputStream类,通过类File对象或者一个表示文件名的字符串可以生成文件输入/输出流对象,同时文件被打开,然后进行文件读/写。,数据输入输出流与文件输入输出流结合举例,注意,写入了基本类型数据程序运行结果?,3.缓冲输入输出流(BufferedInputStream,BufferedOutputStream)当创建一个BufferedInputStream类的实例时,也就创建了一个内部缓冲数组,缺省使用32字节大小的缓冲区.当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区。当写入数据时,首先写入缓冲区,当缓冲区满时,其中的数据写入所连接的输出流。使用方法flush()可以强制将缓冲区的内容全部写入输出流。,【例4.4】BufferedInputStream/BufferedOutputStream类,程序功能?,4.管道输入输出流(PipedInputStream,PipedOutputStream)这两个流用于进程之间的通信。一个PipedInputStream必须连接一个PipedOutputStream,反之亦然。下面是这两个对象建立联系的方法:,管道用来把一个程序、线程或代码块的输出连接到另一个程序、线程或代码块的输入。管道输入流作为一个通信管道的接收端,管道输出流作为发送端。在使用管道之前,管道输出流和管道输入流必须进行连接。,5.格式化输出流(PrintStream)PrintStream具有在System文件句柄使用过的System.out所有的格式化性能。PrintStream有以下两个构造方法:PrintStream(OutputStream outputStream)PrintStream(OutputStream outputStream,boolean flushOnNewline)注意,在上述这些字节输入输出流中,所读出的数据应该是由相应的写入类写入的。,面向字节级I/O编程的一般步骤(1)磁盘文件或字节数据 作为FileInputStream的构造方法的参数,实例化一个 FileInputStream对象。(2)FileInputStream对象作为DataInputStream的构造方法的参数。(3)然后就可以使用InputStream类中的方法,进行字节输入流的操作。例如,read()方法及其重载方法,available(),skip(),close()等。或者用FileInputStream对象作为BufferedInputStream的构造方法的参数,然后使用read()等方法进行读操作。对于字节级输出流也具有相对应的类和方法。,在Java中,定义了专门用于处理字符数据输入输出的抽象类Reader和Writer类,它们与InputStream和Output-Stream类很相似,也有很多子类。1.Reader类和Writer类 它们是所有字符流的超类,它们是直接继承Object类的抽象类,可读写16位的字符流。类层次结构如图:,4.5 字符输入输出类,字节流不能直接操作Unicode字符。在Unicode字符中,一个汉字被看成一个字符。字符流与字节流的区别在于其处理数据的方式。字节流按字节来处理数据,而文本数据可能采用各种不同的字符编码方式,可能是单字节字符,也可能是多字节字符。因而要借助于字符流来处理文本类信息。,BufferedReader从字符输入流中读取文本,该输入流的指向必须是一个Reader流(底层流),由该底层流将数据读入缓冲区,以后BufferReader类创建的流对象就从缓冲区中读取数据。其构造方法如下:public BufferedReader(Reader in);,2.缓冲读写类(BufferedReader,BufferedWriter),BufferedWriter类用来创建一个字符输出流。BufferWriter流将数据写入缓冲区,由底层流(像FileWriter流)写到最终目的地。其构造方法如下:public BufferedWriter(Writer out);问题,当创建这些对象时,其传入参数可以是什么类型?,2.缓冲读写类(BufferedReader,BufferedWriter),3.文件读写类(FileReader,FileWriter),FileReader类用来读取字符数据,其构造方法是:public FileReader(String filename)throws FileNotFoundException public FileReader(File file)throws FileNotFoundException FileWriter类用来写入字符数据,其构造方法是:public FileWriter(String fileName)throws IOException public FileWriter(File file)throws IOException,3.文件读写类(FileReader,FileWriter),例如,FileReader fr=new FileReader(“temp.txt”);BufferReader br=new BufferReader(fr);String s=br.readLine();,【例4.5】BufferedReader/BufferedWriter类,实际文件FileReader类BufferedReader类,实际文件 FileWriter类 BufferedWriter类,注意,写入了字符数据程序运行结果n呢?,利用文件读写类实现文件拷贝,与之前利用缓冲输入输出流进行文件拷贝进行对照程序功能?,利用BufferedReader类可以从字节型流(像System.in)中读出字符数据。Java提供了一个将字节流转换成字符流的类InputStreamReader。反之,OutputStreamWriter类。它们的构造方法是:public InputStreamReader(InputStream in);public OutputStreamWriter(OutputStreamout);,【例4.6】InputStreamReader类,利用BufferedReader类可以从字节型流(像System.in)中读出字符数据。例如,BufferedReader br=new BufferedReader(new InputStreamReader(System.in);因此,BufferedReader类的对象br具有从字节数据中读出字符数据的能力。,例如,从键盘读入一行数字字符,注意,用到了封装器类的方法程序运行结果?,流结束的判断,read()返回-1。readXXX()readInt()、readByte()、readLong()、readDouble()等;产生EOFException。readLine()返回null。,面向字符级I/O编程的一般步骤(l)将字符文件作为参数分别构造FileReader和FileWriter对象。(2)以FileReader对象作为参数构造BufferedReader对象。(3)以FileWriter对象作为参数构造PrintWriter对象。(4)调用BufferedReader对象的readLine()方法读取字符数据或者按照分隔符读取某个记录的每个字段。(5)调用PrintWriter对象的println()方法写入字符数据或记录。对于字符级输出流也具有相应的类和方法。,利用BufferedReader类可以从字节型流(像System.in)中读出字符数据。Java提供了一个将字节流转换成字符流的类InputStreamReader。反之,OutputStreamWriter类。它们的构造方法是:public InputStreamReader(InputStream in);public OutputStreamWriter(OutputStreamout);,利用BufferedReader类可以从字节型流(像System.in)中读出字符数据。例如,BufferedReader br=new BufferedReader(new InputStreamReader(System.in);因此,BufferedReader类的对象br具有从字节数据中读出字符数据的能力。,【例4.7】InputStreamReader类,对象序列化(Serialization)将那些实现了Serializable接口的对象转换成一个字节序列,并且能够将这个字节序列完全恢复为原来的对象,实现了对象的持久性。序列化以后的对象可以在网络上传输,使得不同的计算机可以共享对象。只有实现了Serializable接口的类的对象才可以被串行化,即该对象就是序列化的对象。注意,Serializable接口中没有任何的方法,实现该接口的类不需要实现额外的方法。,4.6 对象序列化,ObjectInputStream类用于读出由ObjectOutputStream写入的对象,只有支持Serializable接口的对象才可以从这个流中读出。其构造方法如下:public ObjectInputStream(InputStream in)throws IOExceptionObjectOutputStream类用于将已实现Serializable接口的对象写入到输出流中。其构造方法如下:public ObjectOutputStream(OutputStream out)throws IOException使用readObject(),writeObject方法可读写一个对象。,对象输入输出流(ObjectInputStream,ObjectOutputStream),【例4.8】ObjectInputStream类和ObjectOutputStream类,程序运行结果?,程序代码,串行化的注意事项,串行化能保存的元素 只能保存对象的非静态成员变量,不能保存任何成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。使用对象流把一个对象写到文件时不仅保证该对象是序列化的,而且该对象的成员对象也必须是可序列化的。,串行化的注意事项,缺省的串行化机制,对象串行化首先写入类和字段的信息,然后按照名称的升序写入其数值。如果想自己明确地控制这些数值的写入顺序和写入种类,必须定义自己的读取数据流的方式。在类的定义中重写writeObject()和readObject()方法。,异常:在程序运行过程中发生的错误,这些错误在编译时无法发现。如数组下标越界,0作为除数等。Java中定义了很多异常类,每个异常类都代表了一种或者多种运行错误,包含了该运行错误的信息和处理错误的方法等内容。每个异常类都继承自Exception类,如图所示:,4.7 异常处理,Java异常类的层次结构和继承关系,Error,一般指与JVM或动态加载等相关的问题,如虚拟机错误,动态链接失败,系统崩溃等,这类错误一般被认为是无法恢复和不可捕捉的,将导致程序中断。,两种处理异常的机制捕获异常当Java运行时系统得到一个异常对象时,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。寻找的对象从生成异常对象的代码块开始,沿着方法的调用栈逐层回溯,直到找到一个方法能够处理这种类型的异常为止。运行时系统把当前异常对象交给这个方法进行处理,这一过程称为捕获(catch)异常。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。,两种处理异常的机制声明抛出异常如果一个方法并不知道如何处理所出现的异常,则可在方法声明时,声明抛出(throws)异常。这是一种消极的异常处理机制。,在Java程序的执行过程中,若出现了异常事件,就会生成一个异常对象。异常对象可能是由正在运行的方法生成,也可能由Java虚拟机生成,其中包含一些信息指明异常事件的类型,及当异常发生时程序的运行状态等。其中,类RuntimeException代表运行时由JVM生成的异常,即在程序运行时发现的由Java解释器引发的各种异常。例如,ArithmeticException,ArrayIndexOutOfBoundsException等。其他的为非运行时异常,是指能由编译器在编译时检测是否发生在方法的执行过程中的异常,例如,IOException,FileNotFoundException等。,java.lang,java.io和包中定义了很多异常类。Java编译器要求Java程序必须捕捉或声明抛出所有的非运行时异常。但对运行时异常可以不作处理。,try-catch-finally语句块 try/可能发生异常的语句或语句块 catch(ExceptionType1 name1)/对ExceptionType1类型异常进行处理 catch(ExceptionType2 name2)/对ExceptionType2类型异常进行处理 finally/强制执行语句块,Java异常处理语句,try-catch-finally语句块的执行流程(1)try块中的语句没有产生异常,在这种情况下,Java首 先执行try块中的所有语句,然后执行finally子句中的代码,最后执行try-catch-finally语句块后面的语句。(2)try块中的语句产生了异常,且此异常在方法内被捕获。此时,Java先执行try块中的语句,直到产生异常,然后跳过此try中的后续语句,执行捕捉此异常的catch块中的语句,然后执行finally子句中的语句。注意:无论try块中是否出现异常,finally块中的语句总是得到执行。,对多个异常进行处理时,程序会按照catch语句的排列顺序匹配被捕捉的异常和每个catch语句的参数,直到找到可以匹配的异常处理方法。多个catch语句的参数应该按照匹配范围由窄到宽的顺序排列。否则会引起以下编译错误:“catch”has already been caught 即,如果宽类型的catch块先于被执行到就会导致那些在后面出现的窄类型catch块永远得不到执行!,异常的捕获及其处理 1.可以在方法体中直接捕获可能出现的异常。在列出多个异常类时由窄类型到宽类型依序排列。例如,void testException try.catch(IOException e)catch(Exception e),【例4.9】异常未捕获和直接捕获,下面是未处理异常时的例子 public class testException public static void main(String args)int x,y,result;x=5;y=0;result=x/y;System.out.println(“这是一个测试字符串!);该程序的运行结果是:,下面是增加异常处理时的例子 public class testException2 public static void main(String args)int x=5,y=0,result;try result=x/y;System.out.println(“发生异常时不会被执行的语句!);catch(Exception e)System.out.println(e.toString();(“这是一个测试字符串!);该程序的运行结果是:,下面是完整的异常处理的情形,该程序的运行结果是:,如果执行return语句呢?,下面是捕捉多个catch块的情形,该程序的运行结果是:,对多个异常进行处理时,程序会按照catch语句的排列顺序匹配被捕捉的异常和每个catch语句的参数,直到找到可以匹配的异常处理方法。多个catch语句的参数应该按照匹配范围由窄到宽的顺序排列。否则会引起以下编译错误:“catch”has already been caught 即,如果宽类型的catch块先于被执行到就会导致那些在后面出现的窄类型catch块永远得不到执行!,2.方法声明抛出异常可以在方法的定义中利用throws关键字声明该方法抛出异常的类型。把那些在方法中不关心或不方便处理的异常传递给上层调用处理。通常,方法的调用者会去捕获这些异常。throws语法如下:void methodName()throws ExceptionType1,ExceptionTypen,运行时异常需要捕获吗?,【例4.10】声明异常和间接捕获,程序运行结果?,4.异常处理的嵌套,Java语言的try-catch语句可以嵌套,即在try块中可以包含另外的try-catch语句。其格式如下:try try catch()catch(),或者在finally子句包含try-catch语句,虽然Java提供了异常的嵌套机制,除非处理过程中一定需要,否则不提倡使用。,可以通过扩展Exception或其子类(像IOException类)创建自定义的异常类,来描述一些在系统定义的异常类中不能描述的问题。可以在方法的定义中利用throws关键字声明该方法抛出异常的类型。把那些在方法中不关心或不方便处理的异常传递给上层调用处理。throws语法如下:void methodName()throws ExceptionType1,ExceptionTypen,5.定义异常类,【例4.10】自定义异常及其处理,例如,自定义一个异常类,并让方法抛出此异常,该程序的运行结果是:,练习题,程序运行结果是:?,下面这种捕捉异常的方式适当吗?为什么。try catch(Exception ex)catch(FileNotFoundException fe),下面是一些异常类的层次关系 j 假设有一个方法X,能够抛出两个异常,ArrayIndex和StringIndex异常,假定方法X中没有try-catch语句,下面哪个答案是正确的。(),方法X应该声明抛出ArrayIndexOutOfBoundsException和StringIndexOutOfBoundsException。如果调用X的方法捕捉IndexOutOfBoundsException,则ArrayIndexOutOfBoundsException和StringIndexOutOfBoundsException都可以被捕获。如果方法X声明抛出IndexOutOfBoundsException,则调用X的方法必须用trycatch语句捕获。方法X不能声明抛出异常。,Answer:B,4.9 本章小结,本章主要介绍了Java语言中用于I/O操作的常用输入输出流,包括:System I/O类,Scanner类 字节输入输出流 字符输入输出流 对象输入输出流Java异常处理机制及其实现、应用,以及自定义异常。在Java程序中,通过包含异常处理代码进行异常捕捉或抛出。,

    注意事项

    本文(Java的IO流和异常处理-v.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开