JAVA输入输出和异常处理.ppt

上传人:xin****828 文档编号:6732445 上传时间:2020-03-02 格式:PPT 页数:74 大小:344KB
返回 下载 相关 举报
JAVA输入输出和异常处理.ppt_第1页
第1页 / 共74页
JAVA输入输出和异常处理.ppt_第2页
第2页 / 共74页
JAVA输入输出和异常处理.ppt_第3页
第3页 / 共74页
点击查看更多>>
资源描述
Java面向对象程序设计 怀化学院计算机系张文hhzw673 2020 3 2 2 IT企业文化 口号训练1 Java Java ILoveYou 2 我一定要学好Java 3 我一定能学好Java 2020 3 2 3 第6章输入 输出和异常处理 2020 3 2 4 思考问题 Why Java程序必须同输入输出设备 文件 显示器 网络等 进行交互 How 2020 3 2 5 6 1I O流 在Java中将不同来源和目标的数据统一抽象为流 通过对流对象的操作来完成I O功能 Java中的流很灵活 可以连接到各种不同的源或目标 如磁盘文件 键盘 输入设备 显示器 输出设备 网络等 2020 3 2 6 流的层次 字节流 2020 3 2 7 流的层次 字符流java io Reader和java io Writer类java io Reader和java io Writer是抽象 abstract 类是基于文本的其它读写器的父类 superclasses 输入 输出流 字节流读写器是基于字符 2020 3 2 8 6 1 3字节流和字符流 根据流处理数据类型的不同也可以将其分为两类 字节流与字符流 下面列出了这两种流的不同之处 字节流 字节流以字节为基本单位来处理数据的输入 输出 一般都用于对二进制数据的读写 如声音 图像等 字符流 字符流以字符为基本单位来处理数据的输入和输出 一般都用于对文本类型数据的读写 如文本文件 网络中发送的文本信息等 虽然文本数据也可以看作二进制数据 但一般采用字符流处理文本数据比采用字节流效率更高 也更方便 2020 3 2 9 处理数据流的核心思想 处理数据流的核心思想能过循环处理每个数据单元 直到遇到结束符或出现异常 Exception 结束符在Unix操作系统下 键入Control D表示数据流的结束在Windows操作系统下 键入Control Z表示数据流的结束 2020 3 2 10 类InputStream 类java io InputStream是一个抽象 abstract 类 声明了从原始字节数据流读入数据的基本方法类中声明的方法 publicabstractintread throwsIOExceptionpublicintread byte data throwsIOExceptionpublicintread byte data intoffset intlength throwsIOExceptionpubliclongskip longn throwsIOExceptionpublicintavailable throwsIOExceptionpublicvoidclose throwsIOExceptionpublicvoidmark intreadlimit publicvoidreset throwsIOExceptionpublicbooleanmarkSupported 2020 3 2 11 类InputStream的成员方法read 读入单个无符号字节 unsignedbyte 的数据 并返回一个整数类型 int 的值 与读入的无符号字节数据相对应 正常返回 介于0和255之间的一个数如果遇到数据流结束 则返回 1publicabstractintread throwsIOException 2020 3 2 12 下面的两个方法可以一次读入多个字节到数组中java io InputStreampublicintread byte data throwsIOExceptionpublicintread byte data intoffset intlength throwsIOException 2020 3 2 13 方法available 给出可以读入的字节数这样在读数据之前就知道可以读入的字节数java io InputStreampublicintavailable throwsIOException 2020 3 2 14 当处理完数据流时 应当关闭该数据流 以便释放该数据流所关联的资源publicvoidclose throwsIOException 2020 3 2 15 类OutputStream OutputStream也是abstract类类中的成员方法 publicabstractvoidwrite intb throwsIOExceptionpublicvoidwrite byte data throwsIOExceptionpublicvoidwrite byte data intoffset intlength throwsIOExceptionpublicvoidflush throwsIOExceptionpublicvoidclose throwsIOException有时输出流会先输出到缓存中 最后再一起将数据写到指定的位置 如文件 方法flush 可以强制进行输出 即强制将数据写到指定的位置 如文件 标准输出 2020 3 2 16 Print数据流 类java io PrintStream是类FilterOutputStream的子类示例 System out和System err类PrintStream的实例对象不会抛出 throws 异常 IOException 这个类 吃掉 traps 所有的异常 IOExceptions 2020 3 2 17 java lang Object java io OutputStream java io FilterOutputStream java io PrintStream 2020 3 2 18 6 2I O流的使用 标准的I O流java lang Object java lang SystemstaticPrintStreamerr标准错误输出流staticInputStreamin标准输入流staticPrintStreamout标准输出流 在Java语言中 键盘用stdin表示 监视器用stdout表示 它们均被封装在System类的类变量in和out中 分别对应于System in和System out 事实上 类变量in和out分别属于类InputStream和PrintStream 只是由于InputStream和PrintStream不能用new 方法直接创建 所以才在System类中声明为如右的3个类变量 2020 3 2 19 6 2I O流的使用 JDK5 0开始提供了类似C语言中的格式化输出的printf 方法 publicPrintStreamprintf Stringformat Objectargs 2020 3 2 20 使用Scanner工具 Java5添加了java util Scanner类 这是一个用于扫描输入文本的新的实用程序 它是以前的StringTokenizer和Matcher类之间的某种结合 由于任何数据都必须通过同一模式的捕获组检索或通过使用一个索引来检索文本的各个部分 于是可以结合使用正则表达式和从输入流中检索特定类型数据项的方法 这样 除了能使用正则表达式之外 Scanner类还可以任意地对字符串和基本类型 如int和double 的数据进行分析 借助于Scanner 可以针对任何要处理的文本内容编写自定义的语法分析器 Scanner是SDK1 5新增的一个类 可是使用该类创建一个对象 2020 3 2 21 Scanner的使用 Scannerreader newScanner System in 然后reader对象调用下列方法 函数 读取用户在命令行输入的各种数据类型 next Byte nextDouble nextFloat nextInt nextLine nextLong nextShot 上述方法执行时都会造成堵塞 等待用户在命令行输入数据回车确认 例如 拥护在键盘输入12 34 hasNextFloat 的值是true 而hasNextInt 的值是false NextLine 等待用户输入一个文本行并且回车 该方法得到一个String类型的数据 下面是一个实例 2020 3 2 22 importjava util publicclassExample publicstaticvoidmain Stringargs System out println 请输入若干个数 每输入一个数用回车确认 System out println 最后输入一个非数字结束输入操作 Scannerreader newScanner System in doublesum 0 intm 0 while reader hasNextDouble doublex reader nextDouble m m 1 sum sum x System out printf d个数的和为 f n m sum System out printf d个数的平均值是 f n m sum m 2020 3 2 23 6 2 3过滤流 过滤流FilterInputStream和FilterOutputStream分别是InputStream和OutputStream的子类 而且它们也都是抽象类 FilterInputStream类和FilterOutputStream类都重写了超类InputStream和OutputStream的方法 FilterInputStream和FilterOutputStream为读写处理数据的过滤流定义接口 其子类则进一步实现接口和方法 这些子类有以下几种 DataInputStream类和DataOutputStream类BufferedInputStream和BufferedOutputStream类LineNumberInputStream类PushbackInputStream类 2020 3 2 24 6 2 4文件随机读写 RandomAccessFile类具有DataInputStream和DataOutputStream对象的所有功能 当程序把一个RandomAccessFile对象与一个文件关联时 程序从文件定位指针指定的位置开始读写数据 并且把所有数据当成基本数据类型来操作 使用RandomAccessFile除了可以读写文件中任意位置的字节外 还可以读写文本和Java的基本数据类型 2020 3 2 25 随机访问文件方式可以在指定位置读 写字节内容RandomAccessFile实例对象同时具有类DataInputStream和类DataOutputStream的功能类RandomAccessFile实现了接口DataInput和DataOutput类DataInputStream实现了接口DataInput类DataOutputStream实现了接口DataOutput 2020 3 2 26 java lang Object java io RandomAccessFilepublicclassRandomAccessFileextendsObjectimplementsDataOutput DataInput 2020 3 2 27 当RandomAccessFile的实例对象与某个文件相关联在指定位置读取或写出数据 位置指定方法如下 voidseek longpos 基本数据类型数据具有固定字节数 如 double 8字节等等 这是Java基本数据类型数据的基本特点 2020 3 2 28 当RandomAccessFile提供的构造方法RandomAccessFile Stringfname Stringmode RandomAccessFile Filefe Stringmode 其中fname是文件名参数 mode是文件访问模式 有 r 和 rw 2020 3 2 29 当RandomAccessFile提供的主要读方法 2020 3 2 30 当RandomAccessFile提供的主要写方法 2020 3 2 31 示例 随机访问文件 J RandomAccessFile java importjava io IOException importjava io RandomAccessFile publicclassJ RandomAccessFile publicstaticvoidmain Stringargs try RandomAccessFilef newRandomAccessFile test txt rw doubled for inti 0 i 10 i f writeDouble 0 5 i f seek 16 f writeDouble 0 f seek 0 for inti 0 i 10 i d f readDouble System out println i d for循环结束f close catch IOExceptione System err println 发生异常 e e printStackTrace try catch结构结束 方法main结束 类J RandomAccessFile结束 2020 3 2 32 6 2 5流的分割 流的分割是由StreamTokenizer类实现的 该类把一个流的内容划分成若干个token单位 一次可以读写一个token token是文本分析算法可识别的最小单位 如单词 符号等 一个StreamTokenizer对象可用于分析任何文本文件 它可以识别标识符 数字 引号包围的字符串以及各种注释形式 尽管StreamTokenizer并不是从InputStream或OutputStream衍生的 但它只随同InputStream工作 所以十分恰当地包括在库的IO部分 StreamTokenizer类用于将任何InputStream分割为一系列 记号 Token 这些记号实际是一些断开的文本块 中间用我们选择的任何东西分隔 例如 记号可以是单词 中间用空白 空格 以及标点符号分隔 2020 3 2 33 Reader和Writer 处理文本数据可以采用类java io Reader和java io Writer类java io Reader和java io Writer是抽象 abstract 类是基于文本的其它读写器的父类 superclasses 输入 输出流 字节流读写器是基于字符 2020 3 2 34 类java io Reader中的成员方法类似于类java io InputStream中的成员方法类java io Writer中的成员方法类似于类java io OutputStream中的成员方法 2020 3 2 35 publicvoidwrite intc throwsIOException写出双字节的单个字符 其值范围 从0到65535 其它write方法 publicvoidwrite char text throwsIOExceptionpublicabstractvoidwrite char text intoffset intlength throwsIOExceptionpublicvoidwrite Strings throwsIOExceptionpublicvoidwrite Strings intoffset intlength throwsIOException 2020 3 2 36 带缓存的Reader可以提高读取数据性能 类java io BufferedReader是类java io Reader的子类java lang Object java io Reader java io BufferedReader当读取数据量很大时 一个很好的方法是 通过类BufferedReader 这时需要给Reader的子类 如 FileReader 外包 上类BufferedReader示例 BufferedReaderbr newBufferedReader newFileReader test 2020 3 2 37 类java io LineNumberReader 类java io LineNumberReader是类java io BufferedReader的子类 带有行号信息java lang Object java io Reader java io BufferedReader java io LineNumberReader类LineNumberReader中的部分方法publicLineNumberReader Readerin publicLineNumberReader Readerin intsize publicvoidsetLineNumber intlineNumber publicintgetLineNumber 2020 3 2 38 类InputStreamReader 类java io InputStreamReader起到了从输入流到Reader的桥梁作用示例 InputStreamReaderisr newinputStreamReader System in 2020 3 2 39 类OutputStreamWriter 类java io OutputStreamWriter起到了从输出流到Writer的桥梁作用示例 OutputStreamWriterosw newOutputStreamWriter System out 2020 3 2 40 读取文件内容 类FileReaderjava lang Object java io Reader java io InputStreamReader java io FileReader示例 FileReaderfr newFileReader test 2020 3 2 41 写文本文件 类java io FileWriterjava lang Object java io Writer java io OutputStreamWriter java io FileWriter示例 FileWriterfw newFileWriter test 2020 3 2 42 写文本文件 类java io FileWriterjava lang Object java io Writer java io OutputStreamWriter java io FileWriter示例 FileWriterfw newFileWriter test 2020 3 2 43 6 3对象的序列化 Java的对象序列化用于将一个实现了Serializable接口的对象转换成一组byte 这样以后要用这个对象时候 就能把这些byte数据恢复出来 并据此重新构建那个对象了 这一点甚至在跨网络的环境下也是如此 这就意味着序列化机制能自动补偿操作系统方面的差异 也就是说 可以在Windows机器上创建一个对象 序列化之后 再通过网络传到Unix机器上 然后在那里进行重建 而不用担心在不同的平台上数据是怎样表示的 byte顺序怎样 或者别的什么细节 2020 3 2 44 6 3 1存储对象 Java序列化技术可以将一个对象的状态写入一个byte流里 并且可以从其他地方把该byte流里的数据读出来 重新构造一个相同的对象 这种机制允许将对象通过网络进行传播 并可以随时把对象存储到数据库 文件等系统里 Java的序列化机制是RMI EJB JNNI等技术的技术基础 并非所有的Java类都可以序列化 为了使指定的类可以实现序列化 必须使该类实现接口java io Serializable 需要注意的是 该接口什么方法也没有 实现该类只是简单的标记 类准备支持序列化功能 2020 3 2 45 6 3 2对象的序列化 Java1 1以后添加了对象序列化机制 可以把实现了Serializable接口的对象序列化 Serializable接口中没有定义任何方法 只是一个特殊的标记 用来告诉Java编译器 这个对象参加了序列化的协议 可以把它序列化 因此一个类实现Serializable接口时 并不需要实现任何针对该接口的方法 2020 3 2 46 6 3 3对象序列化中的一些问题 在对对象序列化的过程中需要注意以下两个问题 1 性能问题为了序列化类A的一个实例对象 所需保存的全部信息如下 与此实例对象相关的全部类的元数据 metadata 信息 因为继承关系 类A的实例对象也是其任一父类的对象 因而 需要将整个继承链上的每一个类的元数据信息 按照从父到子的顺序依次保存起来 2 版本信息当用readObject 方法读取一个序列化对象的byte流信息时 会从中得到所有相关类的描述信息以及示例对象的状态数据 然后将此描述信息与其本地要构造的类的描述信息进行比较 如果相同则会创建一个新的实例并恢复其状态 否则会抛出异常 这就是序列化对象的版本检测 2020 3 2 47 6 4文件管理 前面的章节介绍了Java中的各种I O流 在使用I O流的过程中很多情况下源与目标都是文件 因此 本节将介绍在Java中如何获取目录 文件的信息以及对目录 文件进行管理 2020 3 2 48 6 4 1File类简介 Java中专门提供了一个表示目录与文件的类 java io File 通过其可以获取文件 目录的信息 对文件 目录进行管理 File类一共提供了4个构造器 2020 3 2 49 6 4 2使用File类 下面的例子创建MyFile文件夹 接着在MyFile文件夹下创建ChildFile txt文件 并向文件中写入字符串 通过使用java io包中提供的File类可以方便地对文件 目录进行管理 实际开发中如果有需要 可以参照本例进行开发 File类中的常用方法见P189的表 2020 3 2 50 publicclassCreateFile publicstaticvoidmain String args try Filef1 newFile mydir f1 mkdir for inti 0 i 20 i BufferedInputStreambin newBufferedInputStream newFileInputStream CreateFile java BufferedOutputStreambout newBufferedOutputStream newFileOutputStream newFile f1 CreateFile java intn while n bin read 1 bout write n bin close bout close f1 newFile f1 mydir f1 mkdir catch Exceptione e printStackTrace 2020 3 2 51 实训题目 运行D盘下的CreateFile java文件删除D盘下mydir文件夹 2020 3 2 52 参考代码 importjava io publicclassDeleteFile voiddelete Filef if f isDirectory String files f list for inti 0 i files length i delete newFile f getAbsoluteFile files i f delete publicstaticvoidmain String args DeleteFileapp newDeleteFile app delete newFile mydir 2020 3 2 53 Java异常处理 Exception 基础 异常 Exception 异常 Exception 是正常程序流程所不能处理或没有处理的异常情况或异常事件 在有些书中 异常也称作例外 2020 3 2 54 格式 在try语句块中包含可能会产生异常的语句紧接着若干个catch语句块 进行异常处理catch语句块与finally语句块至少存在一个 try 可能会抛出异常的代码 catch ExceptionTyperef 异常处理代码 finally 2020 3 2 55 为什么需要异常 强制程序异常 错误处理同时指定需要异常的种类异常处理模型提供了一种统一处理异常 错误的模式传统程序方法 设置标志位 或返回错误码 分别处理各种异常情况 但在编程时常常出现这样的情况 忘了对某些异常情况进行处理 尤其是当存在多个分支或者多个开发人员共同开发程序时 简化对异常情况的处理 减少if else语句 2020 3 2 56 什么时候会发生异常 数组的下标越界打开不存在的文件网络无法连接操作数超出所要求的范围少了所需加载的类 自定义异常 要求程序处理 2020 3 2 57 处理异常的几种常用方法 一旦捕获异常 马上进行处理重新抛出异常捕获异常 但并不处理通过语句System exit 退出应用程序 2020 3 2 58 异常 Exceptions 类型 常见异常内存耗尽数组下标越界除数为0非法的参数 方法的参数 2020 3 2 59 异常 Exception 的层次结构 2020 3 2 60 运行时发生的异常 RuntimeExceptions 异常随时都可以发生ArrayIndexOutOfBoundsExceptionNullPointerException定义了引用 但不指向任何对象 object ClassCastException数据类型间的转换不合法良好的编程习惯 可以减少很多异常的发生 2020 3 2 61 受检异常和非受检异常 受检异常必须在方法声明时通过throws列出在编译时就能被检测出非受检测异常不必在throws列表中错误 Errors 和运行时异常 RuntimeExceptions 受检异常 必须处理才能通过编译运行时异常只有在运行时才能被发现错误常常指的是致命性错误 常常也无法处理 2020 3 2 62 处理多种异常 Exception 类型 如果含有多外catch语句块 则异常会被第一个与其相匹配的catch语句块处理 2020 3 2 63 finally语句块 在异常处理过程中 finally语句块总是会被执行到 无论有没有异常发生 也无论有没有异常被捕捉到可选项 finally语句块 通常位于catch语句块的后面可以用来释放try语句块中获得的资源例如 关闭在try语句块中打开的文件 2020 3 2 64 throws列表 在方法的声明处列出所有的受检异常返回类型方法名 参数列表 throws异常类型1 异常类型2 方法体 在本方法内就可以不处理这些异常调用该方法的方法就必须处理这些异常示例 publicstaticvoidg throwsException thrownewException 方法g结束 2020 3 2 65 异常处理 捕捉 或者 声明 如果一个方法调用一个抛出受检异常的方法 含有throws列表的方法 则该方法必须捕捉这些受检异常 或通过throws列表声明这些异常 2020 3 2 66 重新抛出异常 如果catch语句块不处理某种异常 可以重新抛出异常抛出异常的方法 throwe 由其外层的try catch语句块处理 2020 3 2 67 6 5异常处理 有过一些经验的开发人员都能体会到 在开发项目的过程中 开发核心业务代码只占了20 30 的时间 而用于开发容错代码的时间却高达70 80 这大大降低了开发效率 Java中提供的异常处理机制 可以在一定程度上解决这个问题 通过使用异常处理机制 可以使容错代码的开发变得轻松 本章将对Java中的异常处理机制进行详细的介绍 主要包括基本的异常处理 异常的层次结构 定义自己的异常等内容 2020 3 2 68 6 5 1异常处理概述 Java中定义了很多异常类 每个异常类都代表了一种或多种运行错误 异常类中包含了该运行的错误信息和处理错误的方法等内容 每当Java程序运行过程中发生一个可识别的运行错误时 即产生一个异常 Java采取 抛出 捕获 的方式 一旦一个异常产生了 Runtime环境和应用程序抛出各种标准类型和自定义的异常 系统就可以捕获这些异常 并且有相应的机制来处理它 确保不会产生死机 死循环或其他损害 从而保证了整个程序运行的安全性 这就是Java的异常处理机制 2020 3 2 69 6 5 2异常的层次结构 当异常发生时 Java会将该异常包装成一个异常类的对象 并将其引用作为参数传递给相应的catch语句 这样在catch语句中就可以对这个异常对象进行操作 本节将系统地介绍异常类的层次结构 主要内容包括捕获异常与未捕获异常两个方面 1 捕获异常Java类库中有一个java lang Throwable类 继承自java lang Object类 是所有异常类的超类 2 未捕获异常 2020 3 2 70 2020 3 2 71 6 5 3自定义异常 从前面的例子可以看出 用throw语句抛出的异常不一定是捕获的 也可以是自己创建的 Java中每个异常类都代表一种特定的情况 有时系统中已有的异常类型不能满足使用的需要 这时 就需要抛出自定义的异常对象 本节将介绍如何创建以及使用自己定义的异常类 以及显性再抛出在实际开发中的意义与作用 1 创建自己的异常类2 使用自定义的异常类 2020 3 2 72 实训 P206实验二P208实验四 2020 3 2 73 6 6小结 本章简要地介绍了Java的输入 输出和异常处理 概述了Java用于输入输出的I O流以及几种主要I O流类的使用 然后分别介绍了Java对象序列化机制和文件管理 最后介绍了Java中的异常处理 通过对异常的及时处理 可以提高程序运行的稳定性 通过本章的学习 读者可以掌握Java中进行输入输出的方法和异常处理机制 进一步加深对Java知识的理解和应用 2020 3 2 74 WelcometoJava ThankYou
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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