• 1.06 MB
  • 2022-04-29 14:44:48 发布

最新java-IO流分析课件PPT.ppt

  • 68页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'java-IO流分析 本章内容异常File递归字节流转换流字符流其他流 异常概述异常:异常就是Java程序在运行过程中出现的错误。异常由来:问题也是现实生活中一个具体事务,也可以通过java的类的形式进行描述,并封装成对象。其实就是Java对不正常情况进行描述后的对象体现。我们见过的异常,角标越界异常,空指针异常 异常处理方案异常处理方案try…catch…finallythrows try…catch处理方式一个异常的情况多个异常的情况平级情况存在上下级的情况JDK7的新特性及注意事项 编译时异常和运行时异常的区别Java中的异常被分为两大类:编译时异常和运行时异常。所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常编译时异常Java程序必须显示处理,否则程序就会发生错误,无法通过编译运行时异常无需显示处理,也可以和编译时异常一样处理 Throwable中的方法getMessage()获取异常信息,返回字符串。toString()获取异常类名和异常信息,返回字符串。printStackTrace()获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。printStackTrace(PrintStream s)通常用该方法将异常内容保存在日志文件中,以便查阅。 throws定义功能方法时,需要把出现的问题暴露出来让调用者去处理。那么就通过throws在方法上标识。举例分别演示编译时异常和运行时异常的抛出 throw在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。举例分别演示编译时异常对象和运行时异常对象的抛出 throws和throw的区别throws用在方法声明后面,跟的是异常类名可以跟多个异常类名,用逗号隔开表示抛出异常,由该方法的调用者来处理throws表示出现异常的一种可能性,并不一定会发生这些异常throw用在方法体内,跟的是异常对象名只能抛出一个异常对象名表示抛出异常,由方法体内的语句处理throw则是抛出了异常,执行throw则一定抛出了某种异常 到底该如何处理异常呢原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws区别:后续程序需要继续运行就try后续程序不需要继续运行就throws举例:感冒了就自己吃点药就好了,try吃了好几天药都没好结果得了H7N9,那就的得throws到医院如果医院没有特效药就变成Error了 finally的特点作用及面试题finally的特点被finally控制的语句体一定会执行特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))finally的作用用于释放资源,在IO流操作和数据库操作中会见到finally相关的面试题final,finally和finalize的区别如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后。 自定义异常考试成绩必须在0-100之间很明显java没有对应的异常,需要我们自己来做一个异常自定义异常继承自Exception继承自RuntimeException 异常注意事项子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws File类概述和构造方法File类的概述文件和目录路径名的抽象表示形式构造方法publicFile(Stringpathname)publicFile(Stringparent,Stringchild)publicFile(Fileparent,Stringchild) File类的成员方法创建功能publicbooleancreateNewFile()publicbooleanmkdir()publicbooleanmkdirs()删除功能publicbooleandelete()重命名功能publicbooleanrenameTo(Filedest) File类的成员方法判断功能publicbooleanisDirectory()publicbooleanisFile()publicbooleanexists()publicbooleancanRead()publicbooleancanWrite()publicbooleanisHidden() File类的成员方法基本获取功能publicStringgetAbsolutePath()publicStringgetPath()publicStringgetName()publiclonglength()publiclonglastModified()高级获取功能publicString[]list()publicFile[]listFiles() File类练习判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称文件名称过滤器的实现思想及代码publicString[]list(FilenameFilterfilter)publicFile[]listFiles(FilenameFilterfilter)查看源码看执行流程 递归的思想概述递归方法定义中调用方法本身的现象递归注意实现要有出口,否则就是死递归次数不能太多,否则就内存溢出构造方法不能递归使用 递归解决问题的思想及内存图递归解决问题的思想找到出口找到规律求阶乘案例普通for循环递归实现画内存图断点查看执行流程 递归练习兔子问题(斐波那契数列)斐波那契数列1,2,3,5,8,13,21,34(第一项和第二项是1和2,第三项开始,后一项是前两项的和)递归遍历目录下指定后缀名结尾的文件名称递归删除带内容的目录 IO流概述IO流用来处理设备之间的数据传输上传文件和下载文件Java对数据的操作是通过流的方式Java用于操作流的对象都在IO包中 IO流分类按照数据流向输入流读入数据输出流写出数据按照数据类型字节流字符流什么情况下使用哪种流呢?如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流。其他用字节流。如果你什么都不知道,就用字节流 IO流常用基类字节流的抽象基类:InputStream,OutputStream。字符流的抽象基类:Reader,Writer。注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。如:InputStream的子类FileInputStream。如:Reader的子类FileReader。 字节流写数据OutputStreamFileOutputStream往一个文本文件中写一句话:”helloworld”分析发现其实更适合用字符流,但是由于字节流先出现,所以,我们考虑先使用字节流FileOutputStream的构造方法FileOutputStream(Filefile)FileOutputStream(Stringname) 字节流写数据的方式publicvoidwrite(intb)publicvoidwrite(byte[]b)publicvoidwrite(byte[]b,intoff,intlen) 字节流写数据常见问题创建字节输出流到底做了哪些事情?数据写成功后,为什么要close()?如何实现数据的换行?如何实现数据的追加写入? 字节流写数据加入异常处理加入异常处理的IO流操作 字节流读取数据InputStreamFileInputStream把刚才写的数据读取出来显示在控制台FileInputStream的构造方法FileInputStream(Filefile)FileInputStream(Stringname)FileInputStream的成员方法publicintread()publicintread(byte[]b) 字节流读取数据两种方式图解比较一次读取一个字节一次读取一个字节数组每次可以读取多个数据,提高了操作效率 字节流复制数据练习把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中把c:\a.txt内容复制到d:\b.txt中把e:\林青霞.jpg内容复制到当前项目目录下的mn.jpg中把e:\蝴蝶飞呀.mp3复制到当前项目目录下的copy.mp4中 字节缓冲流字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流字节缓冲输出流BufferedOutputStream字节缓冲输入流BufferedInputStream 字节缓冲流复制数据练习把d:demo\16.jpg内容复制到当前项目目录下的mn.jpg中把d:\童年.mp4复制到当前项目目录下的copy.mp4中四种方式比较复制效率 转换流出现的原因及思想由于字节流操作中文不是特别方便,所以,java就提供了转换流。字符流=字节流+编码表。 编码表概述和常见的编码表编码表由字符及其对应的数值组成的一张表常见编码表ASCII/Unicode字符集ISO-8859-1GB2312/GBK/GB18030BIG5UTF-8 字符串中的编码问题编码把看得懂的变成看不懂的解码把看不懂的变成看得懂的 转换流概述OutputStreamWriter字符输出流publicOutputStreamWriter(OutputStreamout)publicOutputStreamWriter(OutputStreamout,StringcharsetName)InputStreamReader字符输入流publicInputStreamReader(InputStreamin)publicInputStreamReader(InputStreamin,StringcharsetName) OutputStreamWriter写数据OutputStreamWriter写数据方法publicvoidwrite(intc)publicvoidwrite(char[]cbuf)publicvoidwrite(char[]cbuf,intoff,intlen)publicvoidwrite(Stringstr)publicvoidwrite(Stringstr,intoff,intlen)字符流操作要注意的问题flush()的作用flush()和close()的区别 InputStreamReader读数据OutputStreamWriter读数据方法publicintread()publicintread(char[]cbuf) 字符流复制文本文件把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中把c:\a.txt内容复制到d:\b.txt中 转换流的简化写法转换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简化我们的书写,转换流提供了对应的子类。FileWriterFileReader FileWriter和FileReaderFileWriter写数据FileReader读取数据FileWriter和FileReader实现文本文件的复制 字符缓冲流BufferedWriter基本用法BufferedReader基本用法字符缓冲流复制文本文件特殊功能BufferedWritervoidnewLine()BufferedReaderStringreadLine()字符缓冲流特殊功能复制文本文件 IO流小结字节流字节输入流字节输出流字符流字符输入流字符输出流 IO流练习复制文本文件复制图片把ArrayList集合中的字符串数据存储到文本文件从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合复制单极文件夹复制单极文件夹中指定文件并修改文件名称复制多极文件夹键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低存入文本文件 IO流练习已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl”请编写程序读取数据内容,把数据排序后写入ss.txt中。用Reader模拟BufferedReader的readLine()功能自定义类模拟LineNumberReader的特有功能获取每次读取数据的行号登录注册IO版 操作基本数据类型的流操作基本数据类型DataInputStreamDataOutputStream 内存操作流操作字节数组ByteArrayInputStreamByteArrayOutputStream操作字符数组CharArrayReaderCharArrayWrite操作字符串StringReaderStringWriter 打印流打印流概述字节流打印流字符打印流打印流特点只能操作目的地,不能操作数据。可以操作任意类型的数据。如果启动了自动刷新,能够自动刷新。可以操作文件的流打印流复制文本文件 标准输入输出流System类中的字段:in,out。它们各代表了系统标准的输入和输出设备。默认输入设备是键盘,输出设备是显示器。System.in的类型是InputStream.System.out的类型是PrintStream是OutputStream的子类FilterOutputStream的子类. 随机访问流RandomAccessFile概述RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。支持对随机访问文件的读取和写入。案例演示 合并流SequenceInputStream概述SequenceInputStream类可以将多个输入流串流在一起,合并为一个输入流,因此,该流也被称为合并流。SequenceInputStream的构造方法SequenceInputStream(InputStreams1,InputStreams2)SequenceInputStream(Enumeratione)把多个文件的内容写入到一个文本文件 序列化流序列化流ObjectOutputStream反序列化流ObjectInputStream序列化操作问题为什么要实现序列化?如何实现序列化?序列化数据后,再次修改类文件,读取数据会出问题,如何解决呢?使用transient关键字声明不需要序列化的成员变量 Properties集合Properties概述Properties作为Map集合的使用Properties的特殊功能publicObjectsetProperty(Stringkey,Stringvalue)publicStringgetProperty(Stringkey)publicSetstringPropertyNames()Properties和IO流的结合使用publicvoidload(Readerreader)publicvoidstore(Writerwriter,Stringcomments) NIO包下的IO流NIO其实就是新IO的意思。JDK4出现NIO。新IO和传统的IO有相同的目的,都是用于进行输入输出的,但新IO使用了不同的方式来处理输入输出,采用内存映射文件的方式,将文件或者文件的一段区域映射到内存中,就可以像访问内存一样的来访问文件了,这种方式效率比旧IO要高很多,但是目前好多地方我们看到的还是旧IO的引用,所以我们仍以旧IO为主,知道NIO即可。JDK7的IO改进(写一个案例)PathPathsFiles 求近似数、四舍五入法 你知道吗?在日常生活中,一些事物的数量有时不用准确数表示,只用一个与准确数比较接近的数。例如,育英小学有学生613名,有时说育英小学有学生大约600名;小明家距学校495米,有时说小明家距学校大约500米。这里的600就看作613的近似数,500就看作495的近似数。 例1同学们浇树。浇了206棵松树,浇了284棵杨树。求这两个数的近似数。206200≈┇约等号读作:206约等于200。想:十位上的0不满5,把十位、个位上的数舍去,改写成0。 ≈约等号 谁能写出下面各数的近似数?407509708≈600≈400≈500≈700 例1同学们浇树。浇了206棵松树,浇了284棵杨树。求这两个数的近似数。284≈300想:十位上的8满5,把十位、个位上的数改写成0,向百位进1。读作:284约等于300 完成第22页的做一做。1、把下面各数大约是几百?说出你是怎样想的。694≈700728≈700367≈400832≈8002、想一想,6250大约是几千?6250≈6000想:百位上的2不满5,把百位、十位、个位上的数舍去,改写成0。 求近似数求万以内数的近似数,要根据要求省略这个数的十位、百位或千位后面的尾数。如果尾数的最高位不满5,就直接把尾数舍去,改写成0;如果尾数的最高位满5,把尾数改写成0后,还要向它的前一位进1。这种求近似数的方法叫做四舍五入法。 作业:练习五(家庭作业1)第24页第1、2、3题(要抄题)'